Programa sendo compilado de maneira diferente em três principais compiladores C ++. Qual é o certo?
Como um acompanhamento interessante (embora não seja de grande importância prática) à minha pergunta anterior:Por que o C ++ nos permite colocar o nome da variável entre parênteses ao declarar uma variável?
Descobri que combinar a declaração entre parênteses comnome da classe injetada Esse recurso pode levar a resultados surpreendentes em relação ao comportamento do compilador.
Dê uma olhada no seguinte 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 com o g ++ 4.9.2 me dá o seguinte erro de compilação:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Compila com sucesso com o MSVC2013 / 2015 e imprimeC (B *)
Compila com sucesso com o clang 3.5 e imprimeC
Então pergunta obrigatória é qual é o certo? :)
(Eu mudei fortemente para a versão clang e a maneira msvc de parar de declarar variável depois de mudar de tipo com tecnicamente seu typedef parece meio estranho)