【问题标题】:Is it an Rvalue or Lvalue After a Cast转换后是右值还是左值
【发布时间】:2016-11-25 09:38:51
【问题描述】:

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

#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 中,只有当它是类类型时,这是指示右值的结果:

T
T const
T
T

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

【问题讨论】:

  • 运行这些测试时请使用最新的编译器
  • @MarcoA。 VC++2015 给出的结果与 VC++2010 相同
  • @MarcoA,对不起,我没有。它不是免费的
  • 我认为这是VS中的一个扩展。有一些绑定到非 const 引用的东西,但细节太早了。如果你添加/Za 来禁用它们,我猜你应该得到与 gcc 相同的行为。是的,工作online

标签: c++ compiler-bug lvalue-to-rvalue


【解决方案1】:

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

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


对于 C++98:

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

那么,gcc 是对的


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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多