对向量中包含的对象有什么要求 在例外C++中,Herb Sutter写了关于代码> AutoPPTR :

对向量中包含的对象有什么要求 在例外C++中,Herb Sutter写了关于代码> AutoPPTR :,c++,vector,c++11,stdvector,C++,Vector,C++11,Stdvector,问题是auto_ptr不完全满足 您可以将类型放入容器中,因为自动打印的副本不可用 相当于 这本书是针对C++03编写的,我想知道这是否仍然有效,因为这段代码似乎在GCC 4.7.1下编译得非常完美: #include <vector> struct Foo { Foo() { } Foo( Foo&& ) { } Foo( Foo& ) = delete; Foo& operator= (Foo&&)

问题是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());
}
#包括
结构Foo
{
Foo(){}
Foo(Foo&&{}
Foo(Foo&)=删除;
Foo&operator=(Foo&&){return*this;}
Foo&运算符=(Foo&)=删除;
};
int main()
{
向量条;
向后推(Foo());
}

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

为了能够使用
std::vector::push_back()
,类型
Foo
需要是
MoveInsertable
CopyInsertable
(23.2.1[容器要求.概述]第13段),根据23.2.3[顺序.rqmts]第16段(表101)。显然,提供
MoveInsertable
模型需要使用带有r值的
push_back()
,这可能是通过
std::move(x)
获得的。也就是说,您甚至不需要移动赋值操作符就可以使用
std::vector::push_back()
。我认为不是所有的标准库都正确地考虑了后面的这一部分,并将其委托给<代码>插入()/代码>:委托给代码>插入()/<代码>不按照C++ 2011标准工作,因为<代码>插入()/<代码>也要求类型为<代码>可移动的< /COD>或<代码>可写的< /COD> < < /P>
尝试搜索
push_-back
不幸地无法为我指向表101,因为名称通过换行被拆分为
push_
back()

要能够使用
std::vector::push_-back()
,类型
Foo
需要是
MoveInsertable
CopyInsertable
(23.2.1[容器要求.概述]第13段)根据23.2.3[顺序.rqmts]第16段(表101)。显然,提供
MoveInsertable
模型需要使用
push_back()
和r值,可能使用
std::move(x)获得<或代码>。也就是说,您甚至不需要移动赋值操作符来使用<代码>:ST::vector:PuthObjiel-Boo.()/Cord>。我认为不是所有的标准库都正确地考虑到后面的这一部分,并委托给<代码>插入()/>代码>:委托给<代码>插入()/<代码>不能按照C++ 2011标准工作,因为<代码>插入()
还要求类型为
可移动可分配
可复制可分配


很遗憾,尝试搜索
push_-back
时无法为我指向表101,因为名称分为
push_
back()
换行…

这有点复杂,因为现在的需求取决于要在向量实例上执行的操作和使用的构造函数。这有点复杂,因为现在的需求取决于要在向量实例上执行的操作和使用的构造函数。好的,那怎么办在向量上使用诸如
std::sort
之类的算法?我能保证可移动性是唯一的要求吗?@qdii:我刚才回答的问题是,使用
push_back()
!其他操作(例如,使用
insert()
)需要什么有其他要求和/或有特定含义。您需要查看各个成员函数和/或算法的要求。好的,在向量上使用诸如
std::sort
之类的算法怎么样?我可以保证移动性是唯一的要求吗?@qdii:我刚才回答的问题是r使用
push_back()
!其他操作(例如使用
insert()
)有其他要求和/或特定含义。您需要查看相应成员函数和/或算法的要求。