2009-08-21 7 views
9

En travaillant sur this question, j'ai trouvé un comportement incohérent. Pourquoi la liaison de référence se comporte-t-elle différemment dans un constructeur à partir d'une fonction commune?const référence de liaison à un rvalue

struct A { 
}; 

struct B : public A { 
    B(){} 
private: 
    B(const B&); 
}; 

void f(const B& b) {} 

int main() { 
    A a(B()); // works 
    A const & a2 = B(); // C++0x: works, C++03: fails 
    f(B()); // C++0x: works, C++03: fails 
} 

Je l'ai testé pour C++ 03 avec g ++ - 4.1 et Comeau 4.2.45.2 dans le strict mode de C++ 03 et C++ 0x des extensions. J'ai les mêmes résultats.

Pour C++ 0x a été testé avec g ++ - 4.4 et Comeau 4.3.9 en mode relâché et avec les extensions C++ 0x activées. J'ai les mêmes résultats.

Répondre

16
A a(B()); 

est la déclaration d'une fonction appelée un retour d'un A et prendre un pointeur vers une fonction sans retour d'un B. Voir here. Ajouter parenthèse et vous obtiendrez l'erreur que vous attendez:

A a((B())); 
+7

connu comme étant « l'analyse syntaxique le plus contrariant ». – earl

+0

Je ne peux pas attendre le jour où je pourrais dire à quelqu'un "que vous avez été victime du problème d'analyse le plus ennuyeux". Bien sûr, au moment où cela se produira, je l'oublierai complètement et recommencerai à détester le C++. –

Questions connexes