gpt4 book ai didi

c++11 - 在 C++11 中为 STL 容器分配一个支撑初始化列表

转载 作者:行者123 更新时间:2023-12-04 23:37:24 26 4
gpt4 key购买 nike

我注意到,除了初始化之外,我还可以将初始化列表分配给 STL 容器,例如 std::array 和 std::vector。例如:

#include <iostream>
#include <array>
#include <vector>
using namespace std;

int main()
{
array<int, 4> arr;
vector<int> vec(4);

arr = {{1, 2, 3, 4}};
vec = {4, 3, 2, 1};

cout << "arr: ";
for (auto elem : arr)
cout << elem << " ";

cout << "\nvec: ";
for (auto elem : vec)
cout << elem << " ";
cout << endl;
}

我正在使用 -std=C++11 标志在 Clang 3.8.0 上编译此代码。我试图辨别这种行为是由 C++11 标准定义的,还是仅由编译器定义的。我一直在尝试通过标准的相关部分(当标准中的语言变得过于复杂时,请访问 cppreference.com),到目前为止已经提出了这个:

初始化列表

5.17.9 - 大括号初始化列表可能出现在用户定义的赋值运算符定义的赋值的右侧

std::array

23.3.2.2:类数组依赖于隐式声明的特殊成员函数……来符合容器要求

std::vector

vector& operator=( std::initializer_list ilist );
  • 用初始化列表标识的内容替换内容
    伊利斯特。 (C++11 起)

  • 从 std::vector 的重载赋值运算符的语法看来,显然支持初始化列表的赋值。所以我想知道将初始化列表传递给为 STL 容器隐式定义的重载赋值运算符(在我的示例中为 std::array )是否是定义行为?作为奖励,std::array 是唯一具有隐式定义的重载赋值运算符的 STL 容器吗?

    我查看了有关 SO 的相关问题的答案,例如:

    how to assign an array from an initializer list

    Error: Assigning to an array from an initializer list

    然而,给出的答案与我从编译器中得到的行为,或者我从标准中得到的解释不一致。另外,我正在寻找一个更一般问题的答案,而不仅仅是将列表初始值设定项分配给 std::array。

    最佳答案

    defect #1527 ,这改变了 中的措辞[expr.ass]/9 从“由用户定义的赋值运算符定义的赋值”到“对类类型对象的赋值”——也就是说,运算符不必是用户定义的。我假设您使用的编译器已经实现了这个缺陷的解决方案。
    std::array具有隐式定义的复制赋值 operator=(const std::array&) - 那就是被调用的那个,参数是 std::array通过聚合初始化临时构造。

    关于c++11 - 在 C++11 中为 STL 容器分配一个支撑初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49433780/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com