代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

decltype和括号

  •  47
  • fredoverflow  · 技术社区  · 15 年前

    我不理解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 就像上面的那一行?

    3 回复  |  直到 15 年前
        1
  •  39
  •   Cubbi    15 年前

    上面写着

    • 如果e是未附加的ID表达式或类成员访问(5.2.5),decltype(e)是e命名的实体的类型。
    • 如果e是左值,decltype(e)是t&,其中t是e的类型;

    我想 decltype(a->x) 是“类成员访问”的示例,并且 decltype((a->x)) 是左值的一个例子。

        2
  •  16
  •   James McNellis    15 年前
    decltype(a->x)
    

    这将为您提供成员变量的类型 A::x ,这就是 double .

    decltype((a->x))
    

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

        3
  •  8
  •   Greg Domjan    15 年前

    添加的parens正在将其转换为左值。

    MSDN says
    内括号使语句被计算为表达式而不是成员访问。由于a被声明为常量指针,所以类型是对const double的引用。