Como uma continuação interessante (embora não de grande importância prática) para minha pergunta anterior: Por que C ++ nos permite colocar o nome da variável entre parênteses ao declarar uma variável?
Eu descobri que combinar a declaração entre parênteses com o recurso de nome de classe injetado 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 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 MSVC2013 / 2015 e imprime
C (B *)
Compila com sucesso com o clang 3.5 e imprime
C
Portanto, a pergunta obrigatória é: qual está certo? :)
(No entanto, mudei fortemente para a versão clang e a maneira do msvc de parar de declarar a variável depois de apenas alterar o tipo com tecnicamente seu typedef parece meio estranho)
C::C
não nomeia um tipo, ele nomeia uma função, então o GCC está certo.
C::C y;
não faz sentido, certo? Nem aC::C (y);
princípio, pensei que fosse uma instância de Most-Vexing-Parse stackoverflow.com/questions/tagged/most-vexing-parse , mas agora acho que é apenas um comportamento indefinido, o que significa que todos os três compiladores estão "certos".