此问题已在此处有答案:
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?
2条答案
按热度按时间5sxhfpxr1#
c
是变量的名称;(c)
是一个表达式,在本例中是一个 lvalue 表达式,其值与变量c
的值相同。这两个是不同的处理
decltype
。例如,考虑decltype(1+2)
,它也是一个采用 * 表达式 * 的例子。碰巧你的例子是一个表达式的 * 简单 * 版本:一个只命名一个变量,并没有什么令人兴奋的。这是你通常只关心的那些差异之一,如果你对语言规范的微妙部分进行合理化;但是,正如你所指出的,它在这种情况下具有相当重要的实际影响。
请注意,这里没有 operator 的用法。这只是从语法结构中推导出来的。
j5fpnvbx2#
我在这里找到了一个很好的描述。它描述了以下两者之间的区别:
我引用如下:
后两种decltype调用之间的差异的原因是括号中的表达式
(a->x)
既不是id表达式也不是成员访问表达式,因此不表示命名对象。[ 13 ]因为表达式是一个左值,所以它的推导类型是“对表达式类型的引用”,或
const double&
。[ 10 ]