可能重复:
initializer_list 和移动语义
在这段代码中:
#include <vector>
#include <initializer_list>
template<typename T>
class some_custom_container : public std::vector<T>
{
public:
some_custom_container(const std::initializer_list<T>& contents)
{
for (auto& i : contents)
this->emplace_back(std::move(i));
}
};
class test_class
{};
int main()
{
test_class a;
some_custom_container<test_class> i = { a, test_class(), a };
}
如果我理解的话,其中的所有对象{ a, test_class(), a }
都是安全构造的:命名对象被复制,未命名对象被移动以构造 initializer_list。之后, thisinitializer_list
通过引用传递给some_custom_container
的构造函数。
然后,为了避免无用的双副本,我将它们全部移动以填充向量。
这个构造函数安全吗?我的意思是,在一种奇怪的情况下,例如,如果 T 被评估为参考 & 或 &&,那么向量是否总是被充分填充(包含安全对象)?
如果是这样,为什么initializer_list
stl容器的构造函数实现不是这样实现的?据我所知,他们的构造函数复制并且不移动内容。