c++ - ingles - tag questions ejercicios
Infix vs sintaxis de prefijo: diferencias de búsqueda de nombres (1)
Los operadores en C ++ generalmente se consideran una sintaxis alternativa para funciones / métodos, especialmente en el contexto de la sobrecarga. Si es así, las dos expresiones a continuación también deben ser:
std::cout << 42;
operator<<(std::cout, 42);
En la práctica, la segunda declaración conduce al siguiente error:
call of overloaded ‘operator<<(std::ostream&, int)’ is ambiguous
Como de costumbre, dicho mensaje de error se acompaña con una lista de posibles candidatos, que son:
operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
operator<<(basic_ostream<char, _Traits>& __out, char __c)
operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
Tal error plantea al menos dos preguntas:
- ¿En qué se diferencian las dos afirmaciones (en términos de búsqueda de nombre)?
- ¿Por qué
operator<<(basic_ostream<char, _Traits>& __out,
int
__c)
?
Parece que las notaciones de infijo y prefijo no son completamente intercambiables: la sintaxis diferente implica diferentes tácticas de resolución de nombres. ¿Cuáles son las diferencias y de dónde vienen?
No, las dos expresiones no deberían ser sinónimos. std::cout << 42
se busca como operator<<(std::cout, 42)
y std::cout.operator<<(42)
. Ambas búsquedas producen candidatos viables, pero la segunda es una mejor coincidencia.