Это 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

Другие вопросы по тегам