做decltype(c)e;和decltype((c))f;声明不同的类型?

时间:2012-10-02 12:04:14

标签: c++ c++11 decltype

  

可能重复:
  decltype and parenthesis

我在维基百科上发现了这个:

    auto c = 0;           // c has type int
    auto d = c;           // d has type int
    decltype(c) e;        // e has type int, the type of the entity named by c
    decltype((c)) f = c;  // f has type int&, because (c) is an lvalue

使用ideone编译器(他们使用的C ++ 0x idk)和typeinfo我无法看到e和f之间的差异。显然,我可能会失败,所以我想知道这是否是最终的C ++ 11标准行为。

1 个答案:

答案 0 :(得分:2)

是的,这是标准行为。它写在§7.1.6.2[dcl.type.simple] / 4中,其中:

  

decltype(e)表示的类型定义如下:

     
      
  • 如果e不明白的 id-expression 或未加密友的类成员访问权限,decltype(e)   是由e。
  • 命名的实体的类型   
  • ...
  •   
  • 否则,如果e是左值,则decltype(e)T&T的类型为e;
  •   
  • ...
  •   

由于c没有括号且是 id-expression (此处为标识符,请参见§5.1.1[expr.prim.general] / 7),{{ 1}}将是decltype(c)的类型,即c

由于int有括号并且是左值(例如(c)是有效表达式),(c)=1将是decltype((c))类型的左值引用类型,其中是(c)