1

这里的代码在类型转换后测试左值或右值:

#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链接中,结果如下所示,表明类型转换后产生的右值:

T
T const 
T
T const 

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

T
T const
T
T

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

4

1 回答 1

2

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

表达式 (T) cast-expression 的结果是类型 T。如果 T 是左值引用类型或对函数类型的右值引用,则结果是左值;如果 T 是对对象类型的右值引用,则结果是 xvalue;否则结果是纯右值。[ 注意:如果 T 是非类类型,它是 cv 限定的,则在确定结果纯右值的类型时会丢弃 cv 限定符;见条款 [expr]。——尾注]


对于 C++98:

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

那么,gcc 是对的


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

于 2016-11-25T09:50:36.290 回答