usar tag questions question que ingles estructura ejercicios ejemplos como c++ syntax operator-overloading iostream

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:

  1. ¿En qué se diferencian las dos afirmaciones (en términos de búsqueda de nombre)?
  2. ¿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.