在此代码中:
#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。之后,通过引用initializer_list
的构造函数传递此some_custom_container
。
然后,为了避免无用的复制副本,我移动它们以填充向量。
这个构造函数安全吗?我的意思是,在一个奇怪的情况下,例如,如果T被评估为参考&amp;或&amp;&amp;,是矢量总是充满(包含它的安全对象)?
如果是这种情况,为什么stl容器的initializer_list
构造函数实现没有以这种方式实现?据我所知,他们的构造函数复制并且不移动内容。
答案 0 :(得分:4)
initializer_list
仅提供对其元素的const
访问权限。您可以使用const_cast
来编译代码,但是移动可能会以未定义的行为结束(如果initializer_list
的元素是真正的const)。所以,做这个动作并不安全。有are workarounds for this,如果你真的需要它。