c++ - 为什么 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>
吗?
解决方案
该标准有意限制这种情况。
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的文件。
推荐阅读
- javascript - 删除部分 img src
- visual-studio-code - 如何在 Visual Studio 代码中同时查看终端、调试控制台和输出屏幕?
- python - PyCharm 中的动态缩写?
- node.js - 通过代码输入用户响应
- java - 使用 REST API 将文件上传到 s3 存储桶
- firebase - Cloud Functions FCM 预期的 OAuth 2 访问令牌
- docker - WSL 上的 Docker 不会绑定挂载 $HOME
- sql - 在 SQL 中,只有在表还没有行的情况下,如何才能添加行?
- mongodb - Service 'MongoDB Server' (MongoDB) failed to start. Verify that you have sufficient privileges to start system services
- javascript - Javascript中的String构造函数如何返回没有键的Object?