Come seguito interessante (non di grande importanza pratica) alla mia domanda precedente: perché il C ++ ci consente di racchiudere il nome della variabile tra parentesi quando si dichiara una variabile?
Ho scoperto che combinare la dichiarazione tra parentesi con la caratteristica del nome della classe iniettata può portare a risultati sorprendenti riguardo al comportamento del compilatore.
Dai un'occhiata al seguente programma:
#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);
}
La compilazione con g ++ 4.9.2 mi dà il seguente errore di compilazione:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Si compila correttamente con MSVC2013 / 2015 e stampa
C (B *)
Si compila correttamente con clang 3.5 e stampa
C
Quindi la domanda obbligatoria è quale sia quella giusta? :)
(Ho fortemente oscillato verso la versione clang e il modo in cui msvc smette di dichiarare la variabile dopo aver cambiato solo tipo con tecnicamente il suo typedef sembra un po 'strano)
C::C
non nomina un tipo, nomina una funzione, quindi GCC ha ragione.
C::C y;
non ha senso, vero? NemmenoC::C (y);
all'inizio ho pensato che fosse un'istanza di Most-Vexing-Parse stackoverflow.com/questions/tagged/most-vexing-parse , ma ora penso che sia solo un comportamento indefinito, il che significa che tutti e tre i compilatori sono "giusti".