C ++ 11:自动如何处理()初始值设定项?

问题描述 投票:-1回答:2

[我知道C ++ 11使用vector初始化auto的方式,实际上是初始化了std::initializer_list而不是vector。但是,给出下面的代码:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    auto x = {1, 2};
    cout << typeid(x).name() << endl;
    auto z = (1, 2);
    cout << z << ", type: " << typeid(z).name() << endl;
    return 0;
}

我不明白:

  1. 为什么使用gcc-10编译器返回的x的类型为St16initializer_listIiE,而返回的'z'的类型为'i'。我们不应该只返回std::initializer_list和'int'吗?
  2. z上有警告:warning: left operand of comma operator has no effect [-Wunused-value]。那么结果的后一半是:2, type: i。 c ++ 11如何解释()初始化的类型?为什么只有最后一个元素传递到z中,因此z仍然是int类型?
c++ c++11 initializer-list auto
2个回答
1
投票

构成初始化列表的唯一内容是{}。在

auto z = (1, 2);

您所拥有的是逗号运算符,它仅返回最后一个值。因此,这意味着您的代码可以归结为

auto z = 2;

并且由于2int,所以zint


0
投票
  1. 因为{ 1, 2 }std::initializer_list<int>,但是(1, 2)是一个表达式,它扩展为逗号运算符(它计算两个参数并返回第二个参数,因此(1, 2)折叠为[ C0],它折叠为(2)。这就是为什么2计算为整数初始化的原因。

  2. 因为只忽略了指令auto z = (1, 2);的结果(请记住1计算两个表达式并丢弃第一个表达式的结果。

© www.soinside.com 2019 - 2024. All rights reserved.