《C++ Primer第5版》std::array花括号列表赋值规则相关疑问
问题解答
核心结论
这是C++标准迭代带来的规则变动,你所参考的习题解答内容沿用了C03及更早版本的数组规则,没有更新到C11及之后的标准要求。
具体说明
- C++03及更早的原生数组确实不支持花括号列表赋值,这也是原书籍表述的由来:原生数组没有重载赋值运算符,无法接收花括号初始化列表作为右值完成赋值操作。
std::array是C11正式加入标准库的容器类型,同时C11新增了复制列表初始化的语法规则,允许类类型通过花括号列表完成赋值:
当执行a2 = {0}时,编译器会先以{0}为参数构造一个临时的std::array<int, 10>对象(首元素赋值为0,剩余元素自动值初始化为0),再调用std::array隐式生成的拷贝/移动赋值运算符,将临时对象的所有元素覆盖到a2中,整个操作完全符合C++11及之后的标准要求。
补充说明
原书籍示例代码:
std::array<int, 10> a1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::array<int, 10> a2 = {0}; // 所有元素值均为0 a1 = a2; // 替换a1中的所有元素 a2 = {0}; // 错误:无法从花括号列表给数组赋值上述标注的错误仅适用于C03及更早的原生数组,在C11及之后版本中
a2 = {0}是合法操作。
目前市面流通的《C++ Primer》第5版已经适配C++11标准,正文部分明确标注了std::array支持列表赋值,你看到的习题解答内容属于旧版规则未更新的疏漏。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

