El programa se compila de manera diferente en 3 compiladores principales de C ++. ¿Cuál es la correcta?
Como un 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 al declarar una variable?
Descubrí que combinar la declaración entre paréntesis connombre de clase inyectado La característica puede conducir a resultados sorprendentes con respecto al comportamiento del compilador.
Echa 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 correctamente con MSVC2013 / 2015 e imprimeC (B *)
Se compila con éxito con clang 3.5 e imprimeC
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 variables después de solo cambiar el tipo con técnicamente su typedef parece un poco extraño)