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

Per*_*-lk 5 c++ containers initializer-list move-semantics c++11

可能重复:
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 };
}
Run Code Online (Sandbox Code Playgroud)

如果我理解了它,那么所有对象{ a, test_class(), a }都是安全构造的:复制了命名对象,并移动了未命名的对象来构造initializer_list.之后,initializer_list通过引用传递给它some_custom_container的构造函数.

然后,为了避免无用的doble-copies,我移动所有这些来填充向量.

这个构造函数安全吗?我的意思是,在一个奇怪的情况下,例如如果T被评估为参考&或&&,那么向量是否总是充满(包含它的安全对象)?

如果是这种情况,为什么initializer_liststl容器的构造函数实现没有以这种方式实现?据我所知,他们的构造函数复制并且不移动内容.

R. *_*des 5

initializer_list只提供const对其元素的访问。您可以使用const_cast该代码编译,但随后移动可能会以未定义的行为结束(如果 的元素initializer_list确实是常量)。所以,不,这样做是不安全的。有变通方法为这个,如果你真正需要它。