![](/img/trans.png)
[英]std::move_if_noexcept calls copy-assignment even though move-assignment is noexcept; why?
[英]Why there is no std::move_if_noexcept counterpart for std::forward in C++11/14?
我看過Scott Meyers關於GoingNative2013“一個有效的C ++ 11/14采樣器”的演講,他解釋了使用std::move_if_noexcept
。
所以在我看來應該有一個std::forward_if_noexcept
來保證forward
異常安全嗎? 為什么標准庫中沒有這樣的內容? 還有其他可能保證嗎?
前向語義已經是有條件的,即它們保留了其參數的值類別。 另一方面,此移動無條件地將其參數的值類別(從l值到r值)更改為r值(引用), std::move_if_noexcept
基於是或std::move_if_noexcept
獲取結果值類別不是移動構造函數不會拋出任何異常,也有效地使它成為有條件的。
簡而言之, std::forward
不會改變任何東西 ,它會保留值類別。 另一方面, std::move
確實改變了值類別。 因此引入std::move_if_noexcept
來說如果std::move
的更改可能導致異常,那么不要改變任何東西 ; 不要動它。
我認為這里的基本原理也分別是std::move
和std::forward
所有東西的慣用語。 在斯科特關於“普遍引用”,轉發和移動的其他一次談話(可能在C ++和2012年之后)中,他非常強調前鋒的習慣用法,我認為這支持了很多std::forward
和它是如何使用的。 它也可能就像從未考慮過一樣簡單。
我認為沒有必要,或者至少在std::forward
實現時需求減少。
鑒於可能有一個用例,實施一個不會太難; 但我不確定一般用例。 可以認為,應該在執行轉發的功能之外測試和處理與可能的異常相關的條件以及所需的異常保證。
template <class U, class T>
U wrapper(T&& arg)
{
return U(forward<T>(arg));
}
template <class U, class T>
U method()
{
T t;
// work with t
return wrapper<U>(move_if_noexcept(t));
}
當然,對於很多這種情況來說,它是“早期的”,因此可能會發生變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.