C ++ – Instanciation de modèle avec type de référence

J’ai un peu entendu parler de problème de référence à référence et de cette résolution. Je ne suis pas très bon avec la terminologie des comités C ++, mais je comprends que l’annotation “Déplacé vers DR” dans le lien signifie qu’il s’agit de l’interprétation actuelle à laquelle les compilateurs conformes devraient se conformer.

J’ai cet exemple de code que je ne comprends pas:

template  struct C { void f(T&) { } void f(const T&) { } }; int main() { C x; // OK C y; // comstack error: f cannot be overloaded C z; // comstack error: f cannot be overloaded } 

Je comprends l’erreur dans le cas C : en utilisant les règles du DR # 106, nous obtenons deux méthodes avec la même signature f (const int &). Ce que je ne comprends pas, c’est le cas C : ne devrait-il pas générer exactement le même code que C (du moins selon la résolution de Stroustrup)?

DR signifie seulement “Rapport de défaut”, et à ma connaissance, la résolution décrite ne l’a pas encore rendu à la norme. Pour cette raison, je pense qu’une implémentation C ++ 03 ssortingctement conforme ne devrait pas comstackr ce code car il constitue une référence à une référence.

[Edit] Je viens de trouver une bonne réponse à cette question.

Fait intéressant, lorsque je comstack votre code (Visual C ++ 10 Express), des erreurs se produisent, mais également lorsque j’essaie ce cas plus simple:

 int main(int argc, char* argv[]) { C x; // OK C x1; // error C2535: 'void C::f(T &)' : member function // already defined or declared return 0; } 

On dirait que la fusion ref-to-ref définie dans le DR que vous avez mentionné signifie que const ref devient une simple référence non-const dans le modèle. Mon problème avec ceci est que je ne comprends pas pourquoi le second f n’est pas simplement ignoré.

Si je change C pour que le second f soit qualifié de const , cela comstack maintenant:

 template  struct C { void f(T&) { } void f(const T& t) const {} }; 

L’implication semble être que lorsque C est instancié avec const quoi que ce soit (ref ou non), les deux surcharges de C::f sont simplement identiques et entraînent une détection des doublons au moment de la compilation.

Peut-être qu’une personne plus intelligente que moi pourra déchiffrer la chaîne plus clairement ici.

EDIT: À la reflection, il n’est pas surprenant que T = const int& résultat que les surcharges f soient identifiées de la même manière que

 void f(const int&) {} 

C’est ce que me dit le compilateur:

 #include "stdafx.h" template  struct C { void f(T&) { } void f(const T&) { } }; int main() { C z; // comstack error: f cannot be overloaded return 0; } 

donne cette erreur:

 1>test.cpp(6): error C2535: 'void C::f(T)' : member function already defined or declared 1> with 1> [ 1> T=const int & 1> ] 1> test.cpp(5) : see declaration of 'C::f' 1> with 1> [ 1> T=const int & 1> ] 1> test.cpp(10) : see reference to class template instantiation 'C' being comstackd 1> with 1> [ 1> T=const int & 1> ] 

Je ne suis même pas convaincu que cela a quelque chose à voir avec le DR.