我正在阅读有多个参数的decltype
并且根据其他人的说法,它只是验证所有类型是否一致,如果是,则完全丢弃所有参数,但最后一个参数。但是,传递另一个参数确实会影响返回值:
int i = 7;
decltype(i) var = i;
++var;
cout << i << endl; // prints '7', as I would expect
但:
int i = 7;
decltype(1, i) var = i;
++var;
cout << i << endl; // prints '8' - apparently 'var' is now a reference to 'i'
为什么?
答案 0 :(得分:4)
decltype
不会带多个参数。你已经传递了一个恰好是逗号表达式的参数。如果逗号表达式的最后一个参数只是一个变量,而不是引入一个临时变量,则表达式作为一个整体求值为一个引用。
如果没有decltype
,您可以看到同样的事情:
#include <iostream>
int main(void) {
int i = 5;
(1, i) = 10;
std::cout << i << std::endl;
}
答案 1 :(得分:2)
您正在查看,
这是C ++中的运算符(逗号运算符)。见row 16
其声明可能如下:
T2& operator,(const T& a, T2& b);
所以a, b, c
评估为((a,b),c)
,(b,c)
,(c)
,它返回对c
的返回类型的引用(a
,b
,c
可以是表达式)
在您的情况下,1, i
会返回对上一个字词i
的引用。因此类型为int&
,因此decltype(1, i) var = i;
变为int& var = i;
(i)
是一个表达式,它的返回值是对i
(int&
)的引用
答案 2 :(得分:2)
当decltype
的参数是直接标识符(或类成员访问权限)时,它将以特殊方式处理 - 它表示参数的确切声明类型。
否则,decltype
的参数将被视为表达式。它解析为根据该表达式的值类别调整的表达式的类型。例如。如果表达式是左值,则此类decltype
表示的类型是引用类型。
在您的情况下,decltype(i)
属于第一类。因此decltype(i)
代表int
,因为i
被声明为int
。
同时您的decltype(1, i)
不适合第一类。它的参数被视为表达式1, i
。因为在C ++中,逗号运算符的这种应用的结果是左值,所以decltype
表示类型int &
。
另一个例子是,由于额外的decltype((i))
,()
不适合第一类。由于表达式(i)
是左值,decltype((i))
表示类型int &
。