具有两个参数的Decltype修改类型

时间:2017-02-23 02:26:35

标签: c++ c++11 decltype

我正在阅读有多个参数的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'

为什么?

3 个答案:

答案 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的返回类型的引用(abc可以是表达式)

在您的情况下,1, i会返回对上一个字词i的引用。因此类型为int&,因此decltype(1, i) var = i;变为int& var = i;

(i)是一个表达式,它的返回值是对iint&)的引用

答案 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 &