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

qdi*_*dii 1 c++ vector stdvector c++11

在Exceptional C++中,Herb Sutter写道auto_ptr:

问题是auto_ptr不能完全满足您可以放入容器的类型的要求,因为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());
}
Run Code Online (Sandbox Code Playgroud)

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

Die*_*ühl 5

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

试图寻找push_back不幸失败,因为名字被分成指向表101,我push_back()一个换行符...