如果我不寫operator =,它不會編譯。
令我吃驚,所以我當時一看爲標準,我發現:
你舉的例子有一個隱含缺失的拷貝構造函數,但還是應該編譯如果符合C++ 11標準庫是在手。
在您的示例中對vector
使用的類型施加約束的唯一表達式是push_back
。
一個序列容器類型X<T,A>
與分配器A
和value_type
T
的push_back()
方法,需要T
爲:
- CopyInsertable如果左值或const右值引用被傳遞
- MoveInsertable如果一個非const的右值被傳遞
這意味着它需要一個有效的拷貝構造函數或(在本例中)一個有效的移動構造函數,它將隱式地從您的代碼中提供。因此,在任何具有有效C++ 11標準庫的編譯器中編譯都不應該失敗。
操作需要的類型,包含在vector
可分配:
配套條件
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
操作
的操作,這需要T
可分配的悲觀*
名單,如果X是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
可能需要可分配。
您需要複製構造函數或移動構造函數。 – Rapptz
它編譯VS2012和Gcc 4.8,你使用哪種編譯器? – billz
@Rapptz我實際上發現你需要複製構造函數和複製賦值,或者移動構造函數和移動賦值。 VS2012在內部使用複製/移動構造函數。 GCC似乎想要複製/移動分配。 – Mysticial