【问题标题】:Decltype with two arguments modifies type带有两个参数的 Decltype 修改类型
【发布时间】:2017-02-23 02:26:34
【问题描述】:

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

为什么会这样?

【问题讨论】:

  • according to everyone else it just validates that all types are consistent and if so, completely discards all parameters but the last one 来源是什么?我以前从未见过有人这么说。
  • 例如,如果我理解正确的话,这里是:stackoverflow.com/questions/16044514/…。 "一对用逗号分隔的表达式从左到右求值;左边的表达式是丢弃值表达式"、"结果与其右边的操作数属于相同的值类别"
  • 试试decltype((i))
  • decltype((i)) 在两种情况下都打印'8'。那么为什么decltype(i) 与其他所有内容不同?或者,换句话说:为什么decltype(i)decltype((i)) 表现不同,而decltype(i, j)decltype((i, j)) 表现相同?

标签: c++ c++11 decltype


【解决方案1】:

decltype 不接受多个参数。您已经向它传递了一个恰好是逗号表达式的参数。如果逗号表达式的最后一个参数只是一个变量,而不是引入一个临时变量,则整个表达式的计算结果是一个引用。

没有decltype你也能看到同样的东西:

#include <iostream>

int main(void) {
  int i = 5;
  (1, i) = 10;
  std::cout << i << std::endl;
}

【讨论】:

    【解决方案2】:

    您正在查看,,它是 C++ 中的运算符(逗号运算符)。见row 16

    它的声明可能如下所示: T2&amp; operator,(const T&amp; a, T2&amp; b);

    所以a, b, c 的计算结果为((a,b),c)(b,c)(c),它返回对c 的返回类型的引用(abc 可以是表达式)

    在您的情况下,1, i 返回对最后一个术语 i 的引用。因此类型是int&amp;,所以decltype(1, i) var = i;变成int&amp; var = i;

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

    【讨论】:

      【解决方案3】:

      decltype 的参数是直接标识符(或类成员访问)时,它会以特殊方式处理 - 它表示参数的确切声明类型。

      否则,decltype 的参数将被视为 表达式。它解析为该表达式的类型根据该表达式的值类别进行调整。例如。如果表达式是左值,那么decltype表示的类型是reference类型。

      在您的情况下,decltype(i) 属于第一类。所以decltype(i) 代表int,因为i 被声明为int

      同时您的decltype(1, i) 不属于第一类。它的参数被视为表达式1, i。由于在 C++ 中,这种逗号运算符应用的结果是一个左值,所以这个decltype 表示类型int &amp;

      再举一个例子,decltype((i)) 也不适合第一个类别,因为有额外的()。由于表达式(i) 是一个左值,所以decltype((i)) 表示类型int &amp;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多