移动初始化列表的元素是否安全?

时间:2012-12-19 16:50:25

标签: c++ c++11 containers move-semantics initializer-list

  

可能重复:
  initializer_list and move semantics

在此代码中:

#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构造函数实现没有以这种方式实现?据我所知,他们的构造函数复制并且不移动内容。

1 个答案:

答案 0 :(得分:4)

initializer_list仅提供对其元素的const访问权限。您可以使用const_cast来编译代码,但是移动可能会以未定义的行为结束(如果initializer_list的元素是真正的const)。所以,做这个动作并不安全。有are workarounds for this,如果你真的需要它。