c++ decltype((c))中括号的意义[副本]

of1yzvn4  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(112)

此问题已在此处有答案

What does decltype((...)) with double parentheses mean? [duplicate](3个答案)
What is decltype and how is it used?(1个答案)
8天前关闭
我在Wikipedia上阅读了这篇关于C++11 * 类型推断 * 特性的文章。
有一个例子,我引用:

#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)表示 lvalue

5sxhfpxr

5sxhfpxr1#

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

这两个是不同的处理decltype。例如,考虑decltype(1+2),它也是一个采用 * 表达式 * 的例子。碰巧你的例子是一个表达式的 * 简单 * 版本:一个只命名一个变量,并没有什么令人兴奋的。
这是你通常只关心的那些差异之一,如果你对语言规范的微妙部分进行合理化;但是,正如你所指出的,它在这种情况下具有相当重要的实际影响。
请注意,这里没有 operator 的用法。这只是从语法结构中推导出来的。

j5fpnvbx

j5fpnvbx2#

我在这里找到了一个很好的描述。它描述了以下两者之间的区别:

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表达式也不是成员访问表达式,因此不表示命名对象。[ 13 ]
因为表达式是一个左值,所以它的推导类型是“对表达式类型的引用”,或const double&。[ 10 ]

相关问题