向量中包含的对象有什么要求

时间:2012-11-22 07:09:14

标签: c++ vector c++11 stdvector

在Exceptional C ++中,Herb Sutter撰写了关于auto_ptr

的文章
  

问题是auto_ptr不太符合a的要求   您可以将类型放入容器中,因为auto_ptrs的副本不是   等效。

本书是关于C ++ 03编写的,我想知道这是否仍然有效,因为这段代码似乎在GCC 4.7.1下完美编译:

#include <vector>

struct Foo
{
    Foo() { }
    Foo( Foo&& ) { }
    Foo( Foo& ) = delete;
    Foo& operator= (Foo&&) { return *this; }
    Foo& operator= (Foo&) = delete;
};

int main()
{
    std::vector<Foo> bar;
    bar.push_back(Foo());
}

但接受可移动但不可复制的对象也可能是GCC扩展。我不确定。 std::vector个对象的要求是什么?

1 个答案:

答案 0 :(得分:5)

为了能够使用std::vector<Foo>::push_back()Foo类型需要为MoveInsertableCopyInsertable(23.2.1 [container.requirements.general]第13段)至23.2.3 [sequence.rqmts]第16段(表101)。显然,提供MoveInsertable模型要求您使用带有r值的push_back(),可能使用std::move(x)获得。也就是说,您甚至不需要移动赋值运算符来使用std::vector<...>::push_back()。我认为并非所有标准库都正确考虑后一部分并委托给insert():委托给insert()根据C ++ 2011标准不起作用,因为insert()也需要类型是MoveAssignableCopyAssignable

遗憾的是,尝试搜索push_back未能为我指向表101,因为该名称被换行符分为push_back() ...