GCC 4.7.2 tut nicht diese kompilieren, wenn das Flag -std=c++98
angegeben ist. Tatsächlich fallen in C++ 98 (sowie in C++ 03) Verweise auf Referenzen nicht zusammen.
Ein Versuch f<int&>
zu instanziieren, wobei T = int&
, die folgende Funktion Signatur erzeugt (hier I die Position des Argumenttypen absichtlich Schalter T
und der const
Spezifizierer, die wegen const T&
erlaubt ist, ist die gleiche wie T const&
):
void f(int& const& t) // ERROR: reference to reference is illegal
Das oben genannte ist in C++ 98, noch in C++ 03 nicht legal. Konsequent ist dies der Fehler, den Sie von GCC 4.7.2 erhalten: Trotzdem
Compilation finished with errors:
source.cpp: In function 'int main()':
source.cpp:15:14: error: no matching function for call to 'f(int&)'
source.cpp:15:14: note: candidate is:
source.cpp:5:6: note: template<class T> void f(const T&)
source.cpp:5:6: note: template argument deduction/substitution failed:
source.cpp: In substitution of 'template<class T> void f(const T&) [with T = int&]':
source.cpp:15:14: required from here
source.cpp:5:6: error: forming reference to reference type 'int&'
, wenn Sie die -std=c++11
Flag verwenden, dann führt der Compiler Referenz kollabiert, wenn die Vorlage Instanziierung: ein L-Wert Referenz auf ein L-Wert-Referenz eine wird L-Wert-Referenz:
void f(int& const& t) == void f(int& t)
Hier ist die const
Qualifier werden fallen gelassen, weil es mit der Referenz gilt, und nicht auf das referenzierte Objekt. Da Referenzen nicht neu zugeordnet werden können, sind sie const
von Natur aus, weshalb die const
als überflüssig und entfernt betrachtet wird. Eine Erläuterung finden Sie unter this Q&A on SO.
Dies ergibt eine lvalue-Referenz auf eine lvalue-Referenz, die in eine einfache lvalue-Referenz aufgelöst wird. Daher wird die Signatur auf der rechten Seite instanziiert.
Das obige ist ein praktikabler Kandidat, um den Anruf für f<int&>(a)
aufzulösen, und daher kompiliert es ohne Fehler.
Ich kann dieses Zitat in C++ 98 oder C++ 03 nicht finden. §14.3.1 ist "Template type arguments" und hat keinen Unterabschnitt oder Absatz 4. –