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

What are the requirements for objects contained in vectors

本文关键字:什么 对象 向量 包含      更新时间:2023-10-16

在《特殊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());
}

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

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

不幸的是,尝试搜索push_back无法为我指向表 101,因为该名称被拆分为push_并通过换行符back()......

相关文章: