在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
个对象的要求是什么?
答案 0 :(得分:5)
为了能够使用std::vector<Foo>::push_back()
,Foo
类型需要为MoveInsertable
或CopyInsertable
(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()
也需要类型是MoveAssignable
或CopyAssignable
。
遗憾的是,尝试搜索push_back
未能为我指向表101,因为该名称被换行符分为push_
和back()
...