为什么可以访问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;
}
Output(如预期):
A::A(const A &)
A::A(const A &)
A::A(const A &)
为什么它的设计如此受限?
最近有一个可移动初始值设定项列表的提案,作者特别指出:
std::initializer_list
设计于 2005 年 (N1890) 至 2007 年 (N2215) 左右,之前
移动语义在 2009 年左右成熟。当时并没有预料到复制语义
对于常见的类似值的类来说,这将是不够的,甚至是次优的。 2008年有一个
提案 N2801初始化器列表和移动语义但当时人们已经感觉到 C++0x 正在下滑,到了 2011 年,这个案子已经凉了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)