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 和括号的主要内容,如果未能解决你的问题,请参考以下文章