在撰寫涉及的代碼時,noexcept我打錯了字,驚訝地發現程式是在 gcc 中編譯的,而不是在 clang 和 msvc 中編譯的。演示
struct C
{
void func() noexcept
{
}
void f() noexcept(noexcept(C::func)) //gcc compiles this but clang and msvc rejects this
{
}
};
所以我的問題是哪個編譯器在這里(如果有的話)?
uj5u.com熱心網友回復:
該程式格式錯誤,并且gcc在接受代碼時是錯誤的,decltype因為我們無法在諸如orsizeof或之類的未評估背景關系中命名非靜態成員函式noexcept operator。
這可以從expr.prim.id看出:
id-expression只能使用表示非靜態資料成員或類的“非靜態成員函式”的An :
- 作為類成員訪問的一部分,其中物件運算式參考成員的類或從該類派生的類,或
- 形成指向成員 ([expr.unary.op]) 的指標,或
- 如果該 id-expression 表示非靜態資料成員并且它出現在未計算的運算元中。
[ 例子:
struct S { int m; }; int i = sizeof(S::m); // OK int j = sizeof(S::m 42); // OK—結束示例]
并且由于 id-expressionC::func表示非靜態成員函式,但不屬于列出的三個類別中的任何一個,因此該程式是病態的。
這是 gcc 錯誤:
GCC 編譯在 noexcept 運算子中對非靜態成員函式的無效使用
還要注意,如果C::func表示一個非靜態資料成員(而不是成員函式),那么由于上面串列中的第三個專案符號,程式的格式應該是正確的。演示
同樣,如果你要寫&C::func的話,由于上面參考的串列中的第二個專案符號,它也會起作用(格式正確)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521052.html
上一篇:UseExceptionHandler未將未處理的例外路由到錯誤頁面
下一篇:armcortex-m33(trustzone,silabsefm32pg22)-訪問GPIO或幾乎所有外圍設備區域的匯編程式硬故障,有什么提示嗎?
