Это Rvalue или Lvalue после приведения
Код здесь проверяет 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 link результат примерно такой, что указывает на значение rvalue, полученное после приведения типа:
T
T const
T
T const
Но в VC++2010 это результат, указывающий значение rvalue, только если это тип класса:
T
T const
T
T
Так это ошибка компилятора или просто какое-то неопределенное поведение при приведении типа к int?
1 ответ
Из 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