decltype 和括号

Posted

技术标签:

【中文标题】decltype 和括号【英文标题】:decltype and parentheses 【发布时间】:2011-03-07 01:58:01 【问题描述】:

我不明白 FCD 第 148 页示例的最后一行(第 7.6.1.2/4 节):

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吗?

【问题讨论】:

反向引用:quuxplusone.github.io/blog/2020/01/22/… 【参考方案1】:

上面那个例子,它说

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

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

【讨论】:

但这并不能解释 const :) @FredOverflow:也有:a 的类型为 const A* “类成员访问”应该是“类数据成员访问”【参考方案2】:
decltype(a->x)

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

decltype((a->x))

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

【讨论】:

好的,我知道现在可以在这里应用规则了,但是为什么规则是这样的?为什么区分a->x(a->x) 有意义?这对我来说似乎很随意。为什么我会想要这种行为?有什么想法吗? 谢谢,但 decltype(f())decltype ((f())) 在我的系统上产生 int。我误会你了吗? @Fred:没关系。我错了。在这种特殊情况下,括号会被忽略,所以两者都应该是const int【参考方案3】:

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

MSDN says 内括号导致语句被评估为表达式而不是成员访问。并且因为 a 被声明为 const 指针,所以类型是对 const double 的引用。

【讨论】:

以上是关于decltype 和括号的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer阅读笔记:decltype

Clang 访问修饰符顺序和 decltype

C++11类型推导的关键字auto和decltype

complexType

c++11新特性

c++11新特性