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

dxf*_*ldu 0 c++ initializer-list auto c++11

我知道 C++11 初始化vectorusing 的方式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;
}
Run Code Online (Sandbox Code Playgroud)

我不明白:

  1. 为什么x返回St16initializer_listIiE的类型是 'z' 返回的类型是 'i',使用 gcc-10 编译器。我们不应该只返回std::initializer_list和'int'吗?
  2. 有一个警告zwarning: left operand of comma operator has no effect [-Wunused-value]。那么结果的第二部分是:2, type: i。c++11 如何解释()-initialized 类型?为什么只有最后一个元素传入z并因此z仍然是 type int

Ani*_*166 5

为什么返回的 x 类型是 St16initializer_listIiE 而返回的 'z' 类型是 'i',使用 gcc-10 编译器。我们不应该只返回 std::initializer_list 和 'int' 吗?

typeid()不会直接给出您所期望的,它只是返回其代码中写下的特定类型标识。如果您想解密相同的内容,请通过以下方式传递c++filt

c++filt -t St16initializer_listIiE
Run Code Online (Sandbox Code Playgroud)

它将导致您期望的结果,即:

std::initializer_list<int>
Run Code Online (Sandbox Code Playgroud)

z 上有一个警告:警告:逗号运算符的左操作数无效 [-Wunused-value]。那么结果的第二部分是:2,输入:i。c++11如何解释()初始化的类型?为什么只有最后一个元素传入 z 并且 z 仍然是 int 类型?

( )是一个包含表达式或表达式列表的初始化程序。如果您将其分配给auto,它将选择表达式列表中的最后一项作为其类型,因为它将用逗号分隔,直到最后一个表达式出现,理想情况下,它会告诉 auto 将其类型分配给最后一个。

例如:

auto x = (1, 1.5L); 
Run Code Online (Sandbox Code Playgroud)

会导致长。

auto x = (1, 1.5f);
Run Code Online (Sandbox Code Playgroud)

会导致浮动。

auto x = (1, "string");
Run Code Online (Sandbox Code Playgroud)

将导致 const char 指针。

它完全忽略了( )初始化器中的第一个值,即int.