首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >decltype和圆括号

decltype和圆括号
EN

Stack Overflow用户
提问于 2010-06-23 07:03:49
回答 3查看 4.2K关注 0票数 53

我不理解FCD (§7.6.1.2/4)第148页上示例的最后一行:

代码语言:javascript
复制
const int&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;     // type is const int&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&

为什么圆括号在这里会有不同?难道不应该像上面的代码行那样简单地使用double吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-23 07:10:25

就在这个例子上面,它写道

  • 如果e是不带括号的id表达式或类成员访问(5.2.5),则decltype(e)是由e命名的实体的类型。
  • 如果e是左值,decltype(e)是T&,其中T是e的类型;

我认为decltype(a->x)是“类成员访问”的一个例子,而decltype((a->x))是一个左值的例子。

票数 41
EN

Stack Overflow用户

发布于 2010-06-23 07:12:13

代码语言:javascript
复制
decltype(a->x)

这为您提供了成员变量A::x的类型,即double

代码语言:javascript
复制
decltype((a->x))

这为您提供了表达式(a->x)的类型,它是一个左值表达式(因此它是一个常量引用--a是一个const A*)。

票数 20
EN

Stack Overflow用户

发布于 2010-06-23 07:10:59

添加的括号将其转换为左值。

MSDN says

内圆括号会使语句作为表达式而不是成员访问进行计算。因为a被声明为常量指针,所以该类型是对常量double的引用。

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

https://stackoverflow.com/questions/3097779

复制
相关文章

相似问题

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