C ++-decltype和括号

我不了解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吗?

fredoverflow asked 2020-02-13T21:46:56Z
3个解决方案
39 votes

在该示例上方,它说

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

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

Cubbi answered 2020-02-13T21:47:23Z
18 votes
decltype(a->x)

这将为您提供成员变量(a->x)的类型,即a

decltype((a->x))

这为您提供了表达式(a->x)的类型,它是一个左值表达式(因此为什么它是const reference--aconst A*)。

James McNellis answered 2020-02-13T21:47:48Z
11 votes

The added parens are turning it into a lvalue.

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

Greg Domjan answered 2020-02-13T21:49:12Z
translate from https://stackoverflow.com:/questions/3097779/decltype-and-parentheses