C ++ 98/03-Referenzzusammenbruch und Lebenslauf-Qualifizierer
Der folgende Code kompiliert (gcc 4.7.2 oder icc 13) und gibt "1 2" aus. Was bedeutet, dassconst
das Qualifikationsmerkmal wird fallengelassen, ich. e.,f<int&>
hat den Parametertypint&
.
Warum passiert das? Soweit ich weiß, laut §14.3.1.4:
Wenn ein Template-Argument für einen Template-ParameterT
benennt einen Typ "Verweis aufcv1 S
", Ein Versuch, den Typ" Verweis auf "zu erstellencv2 T
Erstellt den Typ Verweis aufcv12 S
", wohercv12 ist der Zusammenschluss der CV-Qualifikantencv1 undcv2. Redundante CV-Qualifikanten werden ignoriert.
const
sollte nicht fallen gelassen werden. Hier ist der Code:
#include <iostream>
using namespace std;
template <typename T>
void f(const T& t)
{
t++;
}
int main()
{
int a = 1;
cout << a;
f<int&>(a);
cout << ' ' << a << endl;
return 0;
}