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)
为什么它的设计受到如此限制?
最近有一个关于可移动初始化列表的提议,特别是作者说:
std::initializer_list设计在2005年左右(N1890)到2007年(N2215),在移动语义成熟之前,大约在2009年.当时,没有预料到复制语义对于类似普通类的类来说是不够的,甚至是次优的.有一个2008年的提案N2801 初始化程序列出并移动语义,但C++ 0x已经感觉到当时正在下滑,到2011年,情况变得冷淡.