如果我不写 operator =,它就不会编译。
这让我感到惊讶,所以我查看了标准,我发现:
您的示例有一个隐式删除的复制构造函数,但如果手头有符合标准的 C++11 标准库,则仍应编译。
vector
对示例中使用的类型施加约束的唯一表达式是push_back
.
具有分配器和push_back()
的序列容器类型的方法需要是:X<T,A>
A
value_type
T
T
- 如果传递了左值或 const 右值引用,则CopyInsertable
- 如果传递了非常量右值,则MoveInsertable
这意味着它需要一个有效的复制构造函数或(如在本例中)一个有效的移动构造函数,它将隐含在您的代码中。因此,编译不应该在任何具有有效 C++11 标准库的编译器中失败。
需要类型的操作,包含在 avector
中是可分配的:
辅助条件
typdef std::vector<T> X;
X a,b;
X&& rv;
X::value_type t;
X::value_type&& u;
X::size_type n;
X::const_iterator p,q; // p = valid for a, q = valid and dereferencable
initializer_list<T> il;
[i,j) -> valid iterator-range
悲观*
操作列表
如果 X 是 a ,则需要T
可分配的操作vector
是:
Statement Requirement on T
a = b; CopyInsertable, CopyAssignable
a = rv; MoveInsertable, MoveAssignable
a = il; CopyAssignable
a.emplace(p, args); MoveInsertable, MoveAssignable
a.insert(p, t); CopyAssignable
a.insert(p, u); MoveAssignable
a.insert(p, n, t); CopyInsertable, CopyAssignable
a.insert(p, i, j); EmplaceConstructible[from *i], MoveInsertable, MoveAssignable
a.insert(p, il); -> a.insert(p, il.begin(), il.end());
a.erase(q); MoveAssignable
a.erase(q1,q2) MoveAssignable
a.assign(i,j); Assignable from *i
a.assign(il); -> a.assign(il.begin(), il.end());
a.assign(n,t) CopyAssignable
*
= 悲观的意思是可能存在若干要求实际生效的某些条件。如果您使用上面列出的表达式之一,您的类型T
可能需要可分配。