Код здесь проверяет lvalue или rvalue после приведения типа:
#include <stdio.h>
template <typename T>
T const f1(T const &t) {
printf("T const \n");
return t;
}
template <typename T>
T f1(T &t) {
printf("T\n");
return t;
}
struct KK {
int a;
};
int main()
{
KK kk;
kk.a=0;
int ii;
f1(kk);
f1((KK)kk);
f1(ii);
f1((int)ii);
return 0;
}
В gcc ссылка на сайт результат примерно такой, что указывает на значение rvalue, полученное после приведения типа:
T
T const
T
T const
Но в VC ++ 2010 это результат, указывающий значение rvalue, только если это тип класса:
T
T const
T
T
Так это ошибка компилятора или просто какое-то неопределенное поведение при приведении типа к int?
От expr.cast (это применимо к C ++ 11 и более поздним версиям)
Результат выражения (T) cast-expression имеет тип T. Результатом является lvalue, если T является ссылочным типом lvalue или ссылкой rvalue на тип функции, и xvalue, если T является ссылкой rvalue на тип объекта; в противном случае результат является prvalue. [Примечание: если T является неклассовым типом, который является cv-квалифицированным, cv-квалификаторы отбрасываются при определении типа результирующего значения prvalue; см. пункт [expr]. — конец примечания]
Для C ++ 98:
Результат выражения (T) cast-expression имеет тип T. Результатом является lvalue, если T является ссылочным типом, в противном случае результат является rvalue. [Примечание: если T является неклассовым типом с квалификацией cv, то квалификаторы cv игнорируются при определении типа результирующего значения r; см. 3.10. — конец примечания]
Тогда GCC прав
Из комментария mkaes кажется, что это (возможно, полезно) расширение MSVC
Других решений пока нет …