c++ - operator - En caso de que los operadores sean declarados como amigos no miembros que no sean plantillas
function operator c++ (1)
Considere esta pregunta , que trata sobre el siguiente código que no se está compilando:
std::vector<int> a, b;
std::cout << (std::ref(a) < std::ref(b));
No se compila porque los operadores de comparación de vector
para vector
son plantillas de funciones que no son miembros, y no se permite considerar las conversiones implícitas. Sin embargo, si los operadores se escribieron en su lugar como no miembro no de plantilla, las funciones de friend
:
template <class T, class Allocator = std::allocator<T>>
class vector {
// ...
friend bool operator<(const vector& lhs, const vector& rhs) {
// impl details
}
};
Entonces, esta versión del operator<
habría sido encontrada por ADL y elegida como la mejor sobrecarga viable, y el ejemplo original se habría compilado. Dado lo anterior, ¿hay alguna razón para preferir la plantilla de función no miembro que tenemos actualmente o debería considerarse un defecto en la norma?
Dado lo anterior, ¿hay alguna razón para preferir la plantilla de función no miembro que tenemos actualmente o debería considerarse un defecto en la norma?
La razón es si ADL podría averiguar la función adecuada o no. Cuando tal búsqueda requiere extraer los parámetros de la plantilla sustituida del tipo de objeto dado y luego sustituirlos muchas veces en un parámetro con plantilla de la plantilla de función, ADL no puede hacer esto debido a que no hay razones en el caso general para preferir Una forma de vincular los parámetros de la plantilla a otra. La plantilla de función no miembro definida después, pero aún en el ámbito del espacio de nombres de esa plantilla (debido a un friend
) excluye tal indeterminación.