Como seguimiento interesante (aunque no de gran importancia práctica) a mi pregunta anterior: ¿Por qué C ++ nos permite rodear el nombre de la variable entre paréntesis cuando declaramos una variable?
Descubrí que combinar la declaración entre paréntesis con la característica de nombre de clase inyectada puede llevar a resultados sorprendentes con respecto al comportamiento del compilador.
Eche un vistazo al siguiente programa:
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
Compilar con g ++ 4.9.2 me da el siguiente error de compilación:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Se compila con éxito con MSVC2013 / 2015 e imprime
C (B *)
Se compila con éxito con clang 3.5 e imprime
C
Entonces, la pregunta obligatoria es ¿cuál es la correcta? :)
(Sin embargo, me incliné fuertemente hacia la versión clang y la forma msvc de dejar de declarar la variable después de simplemente cambiar el tipo con técnicamente su typedef parece un poco extraño)
C::C
no nombra un tipo, nombra una función, por lo que GCC tiene razón en mi opinión.
C::C y;
no tiene sentido, ¿verdad? TampocoC::C (y);
Al principio pensé que esta era una instancia de Most-Vexing-Parse stackoverflow.com/questions/tagged/most-vexing-parse , pero ahora creo que es solo un comportamiento indefinido, lo que significa que los tres compiladores son "correctos".