overload operator equal assignment c++ templates operator-overloading language-lawyer

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.