繁体   English   中英

C++11:自动如何处理 () 初始化程序?

[英]C++11: how does auto deal with () initializer?

我知道 C++11 使用auto初始化vector的方式,实际上是初始化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. 为什么返回的x的类型是St16initializer_listIiE而返回的 'z' 的类型是 'i',使用 gcc-10 编译器。 我们不应该只返回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类型?

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

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

c++filt -t St16initializer_listIiE

它将产生您所期望的结果,即:

std::initializer_list<int>

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

( )是一个包含表达式或表达式列表的初始值设定项。 如果要将其分配给auto ,它将 select 表达式列表中的最后一项作为其类型,因为它将用逗号分隔,直到最后一个表达式出现,理想情况下告诉 auto 将其类型分配给最后一个.

例如:

auto x = (1, 1.5L); 

会导致很长。

auto x = (1, 1.5f);

会导致浮动。

auto x = (1, "string");

将产生一个 const char 指针。

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

唯一构成初始化列表的是{}

auto z = (1, 2);

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

auto z = 2;

因为2int ,所以zint

  1. 因为{ 1, 2 }是一个std::initializer_list<int> ,但(1, 2)是一个表达式,它扩展为逗号运算符(它同时计算 arguments 并返回第二个结果,所以(1, 2)被折叠成(2) ,它被折叠成2 。这就是为什么auto z = (1, 2);评估为 integer 初始化的原因。

  2. 因为指令1的结果被简单地忽略(记住(1, 2)计算两个表达式并丢弃第一个的结果)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM