[英]std::move_if_noexcept calls copy-assignment even though move-assignment is noexcept; why?
[英]Does disabling support for exceptions also disable support for `std::move_if_noexcept`?
一些商店(例如,一些視頻游戲開發團隊)在其構建環境中禁用對異常的支持。 在禁用異常的情況下,開發人員沒有理由聲明他們的移動操作noexcept
(假設這樣的代碼甚至可以編譯)。 但是標准庫實現應該在實現某些操作時調用std::move_if_noexcept
(例如, std::vector::push_back
)。 標准庫實現通常在編譯期間檢查以查看是否禁用了異常,如果是,則使用std::move
而不是std::move_if_noexcept
? 當禁用異常時,編譯器會導致std::is_nothrow_move_constructible
為所有類型返回true嗎? 或者禁用異常支持會產生意外的副作用std:move_if_noexcept
無法啟用移動操作?
我對實踐中發生的事情很感興趣。 我知道禁用異常支持會使我們脫離C ++標准的范疇。
在啟用或不啟用異常的情況下,此代碼在GCC 4.9和clang 3.5上輸出false true false true
:
void foo() {}
void bar() noexcept {}
void foo2() noexcept(noexcept(foo())) {}
void bar2() noexcept(noexcept(bar())) {}
int main() {
std::cout << std::boolalpha << noexcept(foo()) << ' ' << noexcept(bar())
<< ' ' << noexcept(foo2()) << ' ' << noexcept(bar2()) << std::endl;
}
所以看起來noexcept
行為至少對這兩個編譯器來說並不依賴於編譯器選項。
更新:VS2013 根本不支持noexcept
。
-fnothrow-opt將throw()異常規范視為noexcept規范,以減少或消除相對於沒有異常規范的函數的文本大小開銷。 如果函數具有帶有非平凡析構函數的類型的局部變量,則異常規范實際上使函數變小,因為可以優化這些變量的EH清理。 語義效果是從具有這種異常規范的函數拋出的異常導致調用終止而不是意外。
所以根據gcc文檔的throw函數變成noexcept規范。
這應該意味着更多的對象將返回true而不是更少
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.