6

可能重复:
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_liststl容器的构造函数实现不是这样实现的?据我所知,他们的构造函数复制并且不移动内容。

4

1 回答 1

5

initializer_list只提供const对其元素的访问。您可以使用const_cast来编译该代码,但是这些移动最终可能会导致未定义的行为(如果 的元素initializer_list是真正的 const )。所以,不,这样做是不安全的。如果您确实需要它,则有解决方法。

于 2012-12-19T17:26:29.373 回答