Comme suivi intéressant (pas d'une grande importance pratique cependant) à ma question précédente: Pourquoi C ++ nous permet-il d'entourer le nom de la variable entre parenthèses lors de la déclaration d'une variable?
J'ai découvert que la combinaison de la déclaration entre parenthèses avec la fonction de nom de classe injectée peut conduire à des résultats surprenants concernant le comportement du compilateur.
Jetez un œil au programme suivant:
#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 compilation avec g ++ 4.9.2 me donne l'erreur de compilation suivante:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Il se compile avec succès avec MSVC2013 / 2015 et imprime
C (B *)
Il se compile avec succès avec clang 3.5 et imprime
C
La question obligatoire est donc laquelle a raison? :)
(Je me suis fortement incliné vers la version clang et la manière msvc d'arrêter de déclarer une variable après avoir simplement changé de type avec techniquement son typedef semble un peu bizarre)
C::C
ne nomme pas un type, il nomme une fonction, donc GCC a raison imo.
C::C y;
n'a pas de sens, non? Ni neC::C (y);
Au début , je pensais que c'était une instance de plus-vexatoire-Parse stackoverflow.com/questions/tagged/most-vexing-parse , mais maintenant je pense que ce comportement est tout simplement indéfini qui signifie trois compilateurs sont « droit ».