我有這樣的代碼(簡化):爲什麼remove_if(...,lambda)表達式需要賦值運算符?
std::vector<Session> sessions;
// ...
std::remove_if(sessions.begin(), sessions.end(),
[] (const Session& s) {
return false;
}
);
當我編譯它(在Visual Studio 2013更新1)我得到以下錯誤:
algorithm(1759): error C2280: 'Session &Session::operator =(const Session &)' : attempting to reference a deleted function
Session.h(78) : see declaration of 'Session::operator ='
事實上,我已經在刪除operator=
Session
類是這樣的:
Session& operator= (const Session& that) = delete;
我問題是:爲什麼那使用lambda表達式的remove_if
需要賦值運算符?一個Session
對象在哪裏分配給另一個?
更新:正如@nosid解釋和@Praetorian remove_if
需要移動或拷貝構造函數&賦值運算符。根據C++ 11標準,移動構造函數/賦值運算符應該由編譯器自動生成。不幸的是Visual Studio 2013 does not do that。由於該類不可複製remove_if
也無法訴諸複製,因此編譯器顯示錯誤。我通過手動實現移動構造函數和移動賦值操作符來修復它。
這不是_lambda表達式,需要'operator ='。它是'std :: remove_if'算法,因爲它移動了元素(而不是刪除它們)。 – nosid
@nosid:聽起來不錯。你爲什麼不把它作爲答案發布? –
重寫了一個觸摸問題:雖然它完全不符合您的原始問題(畢竟問題不是您認爲的問題),但對於有相同問題的人來說搜索應該更容易。 – Yakk