initializer_list不可变性导致过度复制

Ori*_*ent 11 c++ initializer-list move-semantics c++11 c++14

为什么访问权限std::initializer_list不允许我们更改其内容?std::initializer_list当它用于其主要目的(初始化容器)时,这是一个很大的缺点,因为它的使用会导致过多的复制构造/复制分配,而不是移动构造/移动分配.

#include <initializer_list>
#include <iostream>
#include <vector>

#include <cstdlib>

struct A
{

    A() = default;
    A(A const &) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
    A(A &&) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
    A & operator = (A const &) { std::cout << __PRETTY_FUNCTION__ << std::endl; return *this; }
    A & operator = (A &&) { std::cout << __PRETTY_FUNCTION__ << std::endl; return *this; }

};

int
main()
{
    std::vector< A >{A{}, A{}, A{}};
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

输出(如预期):

A::A(const A &)
A::A(const A &)
A::A(const A &)
Run Code Online (Sandbox Code Playgroud)

为什么它的设计受到如此限制?

Ant*_*vin 6

最近有一个关于可移动初始化列表的提议,特别是作者说:

std::initializer_list设计在2005年左右(N1890)到2007年(N2215),在移动语义成熟之前,大约在2009年.当时,没有预料到复制语义对于类似普通类的类来说是不够的,甚至是次优的.有一个2008年的提案N2801 初始化程序列出并移动语义,但C++ 0x已经感觉到当时正在下滑,到2011年,情况变得冷淡.