首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是Rvalue还是Lvalue在一个角色转换之后?

是Rvalue还是Lvalue在一个角色转换之后?
EN

Stack Overflow用户
提问于 2016-11-25 09:38:51
回答 1查看 479关注 0票数 1

此处的代码测试类型强制转换后的lvalue或rvalue:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
T
T const 
T
T const 

但是在VC++2010中,只有当rvalue是类类型时,这才是指示rvalue的结果:

代码语言:javascript
复制
T
T const
T
T

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-25 09:50:36

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

表达式( T )转换表达式的结果为T类型,如果T是lvalue引用类型或函数类型的rvalue引用,则结果是lvalue;如果T是对对象类型的rvalue引用,则为xvalue;否则,结果是prvalue。[注意:如果T是一个非类类型,是cv-限定的,则在确定结果prvalue的类型时,cv-限定符将被丢弃;请参见子句expr。-尾注]

对于C++98:

表达式( T )转换表达式的结果为T类型,如果T是引用类型,则结果为lvalue,否则结果为rvalue。注意:如果T是cv限定的非类类型,则在确定结果rvalue的类型时忽略cv-限定符;请参见3.10。-尾注

那么gcc是对的

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40801765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档