[英]std::function's move assignment is not noexcept, but std::function::swap is. What gives?
func.wrap.func中的 std::function
的概要告訴我們
function& operator=(function&&);
移動賦值運算符不是noexcept
,禁止僅使用標准容器中的移動類型。
但! 它也告訴我們
void swap(function&) noexcept;
同樣,默認構造函數是
function() noexcept;
因此,我們可以使用默認構造函數后跟交換來實現移動構造函數。
因為我們可以使用swap
實現移動賦值運算符( swap
具有更強的后置條件):
std::function
實現noexcept
swap? std::function
的移動賦值運算符不是noexcept
? 如何在
std::function
實現noexcept
swap?
std::function
對象不一定直接包含目標。 它可以包含指向動態分配的目標內存副本的指針。 它幾乎可以用任何理由來做這件事。 最常見的是目標太大而無法直接適應function
,但對於阻止function
滿足其要求的任何其他目標也是如此。 如果function
只保存指針,則該指針可以很容易地移動到另一個function
。
為什么
std::function
的移動賦值運算符不是noexcept
?
沒有充分的理由,這就是為什么有一個建議在未來的C ++版本中使它成為noexcept
: p0771r0 。 它指出,與標准指定的相反,一些實現已經將此標記為noexcept
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.