在演员之后是Rvalue还是Lvalue

时间:2016-11-25 09:38:51

标签: c++ compiler-bug lvalue-to-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中,结果如下所示,表明在类型转换后产生了右值:

T
T const 
T
T const 

但是在VC ++ 2010中,只有当它是类类型时才会显示rvalue:

T
T const
T
T

当类型转换为int时,它是编译器错误还是只是一些未定义的行为?

1 个答案:

答案 0 :(得分:1)

来自expr.cast(这适用于C ++ 11及更高版本)

  

表达式(T)cast-expression的结果是T类型。如果T是左值引用类型或函数类型的右值引用,则结果是左值;如果T是对象类型的右值引用,则结果为xvalue ; 否则结果是prvalue 。 [注意:如果T是具有cv限定的非类型类型,则在确定结果prvalue的类型时将丢弃cv限定符;见条款[expr]。 - 结束说明]

对于C ++ 98:

  

表达式(T)cast-expression的结果是T类型。如果T是引用类型,则结果是左值,否则结果是rvalue。 [注意:如果T是具有cv限定的非类型类型,则在确定结果rvalue的类型时将忽略cv限定符;见3.10。 - 结束说明]

然后,gcc是对的

来自mkaes的评论,似乎这是(可以说是有用的)MSVC扩展