括号中的括号的重要性((c))?

时间:2013-01-02 00:54:26

标签: c++ c++11 decltype

我正在阅读this article on Wikipedia regarding C++11 Type Inference feature

有一个例子,我引用:

#include <vector>
int main() {  
    const std::vector<int> v(1);  
    auto a = v[0];        // a has type int  
    decltype(v[1]) b = 1; // b has type const int&, the return type of  
                          //   std::vector<int>::operator[](size_type) const  
    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  
    decltype(0) g;        // g has type int, because 0 is an rvalue  
}

以下几行:

    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  

c(c)之间有什么区别?为什么(c)代表左值

2 个答案:

答案 0 :(得分:21)

  • c是变量的名称;

  • (c)是一个表达式,在本例中是 lvalue 表达式,其值与变量c的值相同。

    < / LI>

decltype对两者的处理方式不同。例如,考虑decltype(1+2),这也是一个采用表达式的示例。只是碰巧你的例子是一个表达式的简单版本:一个只是命名一个变量,并且没有什么令人兴奋的。

如果您对语言规范的细微部分进行合理化,那么您通常只关心这些差异之一;但是,正如您所确定的那样,在这种情况下它具有非常重要的实际效果。

请注意,此处没有运营商用法。这只是语法布局的一个推论。

答案 1 :(得分:9)

我找到了一个很好的描述here。它描述了:

之间的区别
struct A { double x; };
const A* a = new A();
...
decltype(a->x) x4; // type is double
decltype((a->x)) x5; // type is const double&

我引用:

  

后两种decltype调用之间差异的原因是括号表达式(a->x)既不是id-expression也不是成员访问表达式,因此不表示命名对象。 [13]

     

因为表达式是左值,其推导类型是“对表达式类型的引用”或const double&。 [10]