1

Herb Sutter 在 Exceptional C++ 中写道auto_ptr

问题是 auto_ptr 不能完全满足可以放入容器的类型的要求,因为 auto_ptr 的副本不等价。

这本书是针对 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对对象有什么要求?

4

1 回答 1

5

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

不幸的是,尝试搜索无法为我指向表 101 ,push_back因为名称被分成换行符......push_back()

于 2012-11-22T07:30:06.793 回答