我注意到 MSVC 有時無法推斷出其他編譯器接受的非型別引數,并且最近遇到了一個涉及函式 noexcept 說明符的簡單示例(這是自 C 17 以來函式簽名的一部分):
template <typename T> struct is_nocv_method : public std::false_type { };
template <typename ReturnT, typename ClassT, bool IsNoexcept, typename... Args>
struct is_nocv_method<ReturnT (ClassT::*)(Args...) noexcept(IsNoexcept)> : std::true_type { };
Godbolt 建議 gcc 12.1 和 clang 14.0 接受這個沒有問題,但 MSVC 14.31 (cl.exe 19.31) 無法編譯,聲稱IsNoexcept無法推斷。這是編譯器缺陷嗎?
演示
uj5u.com熱心網友回復:
不能從noexcept-specifier推匯出非型別模板引數。
[temp.deduct.type]/8給出了可以從中推匯出模板引數的背景關系串列。本質上,它可以被解讀為“解包”引數型別的方法串列,以及解包型別中可以推匯出模板引數的位置串列。
例如,該專案T (T::*)(T)暗示如果形參型別和實參型別都是指向成員函式的指標,那么模板形參可以從回傳型別、型別別和任何實參型別(對于成員函式)推匯出來,如果它們出現在那里。
您會注意到沒有 , 等形式的T() noexcept(i)專案T(T) noexcept(i)。
然而,一些編譯器還是選擇允許這種推論,可能是因為它很方便。我會支持將其添加到標準中。
uj5u.com熱心網友回復:
請參閱此錯誤報告:https ://developercommunity.visualstudio.com/t/noexcept-is-not-deducible-in-partial-spe/841571
而這個問題,由 EWG 批準:https ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1018r9.html#CWG2355
似乎從 noexcept 說明符中扣除目前是非標準的,但這被認為是疏忽并且將被修復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486489.html
上一篇:在Golang模板中將物件歸零
