对向量中包含的对象有什么要求
What are the requirements for objects contained in vectors
在《特殊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
需要MoveInsertable
或CopyInsertable
(23.2.1 [container.requirements.general] 第13段)。显然,提供MoveInsertable
模型需要您使用带有 r 值的push_back()
,可能使用 std::move(x)
获得。也就是说,您甚至不需要移动分配运算符即可使用 std::vector<...>::push_back()
.我认为并非所有标准库都正确地考虑了后一部分并委托给insert()
:根据 C++ 2011 标准,委派给 insert()
不起作用,因为insert()
还要求类型MoveAssignable
或CopyAssignable
。
不幸的是,尝试搜索push_back
无法为我指向表 101,因为该名称被拆分为push_
并通过换行符back()
......
相关文章:
- 什么时候调用组成单元对象的析构函数
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 是什么让放置新调用对象的构造函数?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 为对象分配整数.输出将是什么?
- 当使用对象名称后带有 [] 的类对象时,您究竟会传入什么.C++
- 什么是"undetectable means",它们如何更改 C/C++ 程序的对象?
- 在C++中,创建'n'数量的对象的推荐方法是什么,其中n是用户定义的。我该怎么做?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 对于什么对象指针值,指向成员的指针运算符调用未定义的行为
- 如何判断哪个#include提供了什么对象
- 面向对象概念的例子车,这里应该是什么对象
- 如何知道QTabWidget选项卡持有什么对象类型