【发布时间】:2012-12-07 02:05:54
【问题描述】:
在这段代码中:
#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 通过引用传递给some_custom_container 的构造函数。
然后,为了避免无用的双副本,我将它们全部移动以填充矢量。
这个构造函数安全吗?我的意思是,在一种奇怪的情况下,例如,如果 T 被评估为引用 & 或 &&,那么向量是否总是填充良好(包含安全对象)?
如果是这样的话,为什么stl容器的initializer_list构造函数实现不是这样实现的呢?据我所知,他们的构造函数复制而不移动内容。
【问题讨论】:
-
它甚至无法编译,因为初始化列表仅提供对其内容的 const 访问,并且您无法从对 const 的引用中移动。另见:stackoverflow.com/questions/8468774/…
-
这不会阻止它编译,只会移动。将调用复制构造函数。
标签: c++ c++11 containers move-semantics initializer-list