首页 > 解决方案 > 为什么 c++11 不允许使用 auto 进行直接列表初始化

问题描述

我的朋友告诉我

auto x1 = {3}; // x1 is std::initializer_list<int>
auto x2{1, 2}; // error: not a single element
auto x3{3};    // x3 is int

我不太明白为什么auto x2{1, 2};是非法的,不能直接推断为std::initializer_list<int>吗?

标签: c++c++11autotype-deduction

解决方案


该标准有意限制这种情况。

auto x2{1, 2}; // error: not a single element

自动和大括号初始化器会导致可教性问题;我们想教人们使用统一初始化,但我们需要特别告诉程序员避免使用 auto 大括号。在 C++14 中,我们现在遇到了更多 auto 和大括号有问题的情况;函数的返回类型推导部分避免了这个问题,因为返回一个花括号列表将不起作用,因为它不是一个表达式。然而,返回一个从大括号初始化器初始化的自动变量仍然会返回一个 initializer_list,从而引发未定义的行为。Lambda 初始化捕获有同样的问题。本文建议将大括号初始化的 auto 更改为不推导出初始化器列表,并在大括号初始化器具有多个元素的情况下禁止使用大括号初始化的 auto。

有关更多详细信息,请参阅 ISO/IEC JTC1/SC22/WG21 C++ 标准委员会关于Auto 和 braced-init-lists的文件。


推荐阅读