首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++11中将带大括号的init列表分配给STL容器

在C++11中将带大括号的init列表分配给STL容器
EN

Stack Overflow用户
提问于 2018-03-22 16:27:28
回答 2查看 181关注 0票数 4

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

代码语言:javascript
运行
复制
#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标志在Clang3.8.0上编译这段代码。我试图辨别这种行为是由C++11标准定义的,还是仅由编译器定义的。我一直在试图通过标准的相关部分(以及标准中的语言变得过于复杂时的cppreference.com ),到目前为止,我已经想出了以下内容:

初始化程序列出

5.17.9 -由用户定义的赋值运算符定义的赋值的右侧可能会出现大括号-init-列表。

std::数组

23.3.2.2:类数组依赖隐式声明的特殊成员函数.符合集装箱要求

std::向量

向量& operator=( std::initializer_list ilist );

  • 将内容替换为由初始化程序列表无效者标识的内容。(自C++11以来)

从std::向量重载赋值操作符的语法来看,显然支持初始化程序列表的赋值。因此,我想知道是否将初始化程序列表传递给为STL容器隐式定义的重载赋值操作符(在我的示例中是std::array)是否是定义的行为?值得注意的是,std::数组是唯一带有隐式定义的重载赋值操作符的STL容器吗?

我看过相关问题的答案,例如:

如何从初始化程序列表中分配数组

错误:从初始化程序列表分配给数组

然而,给出的答案并不符合我从编译器那里得到的行为,也不符合我从标准中解释的内容。此外,我正在寻找一个更普遍的问题的答案,而不仅仅是将列表初始化器分配给std::array。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-22 16:48:58

参见缺陷#1527,它将expr.ass/9中的措辞从“由用户定义的赋值操作符定义的赋值”改为“对类类型对象的赋值”,也就是说,运算符不必是用户定义的。我假设您使用的编译器已经实现了解决此缺陷的方法。

std::array具有隐式定义的复制赋值operator=(const std::array&) --这就是被调用的副本赋值,参数是通过聚合初始化构造的std::array临时参数。

票数 4
EN

Stack Overflow用户

发布于 2018-03-22 16:50:08

没有为接受std::arrayinitializer_list定义赋值操作符。

但是,隐式定义赋值运算符(即std::array本身)的参数可以从初始化程序列表中构造。这正是这里发生的事情。

请注意,这并不适用于内置数组,这些数组根本无法分配。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49433780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档