Это 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 ссылка на сайт результат примерно такой, что указывает на значение rvalue, полученное после приведения типа:

T
T const
T
T const

Но в VC ++ 2010 это результат, указывающий значение rvalue, только если это тип класса:

T
T const
T
T

Так это ошибка компилятора или просто какое-то неопределенное поведение при приведении типа к int?

0

Решение

От 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]