在模板的以下定義中struct B,lambda 用作非型別模板引數的默認值,并且在 lambda 的主體中A定義了一些型別:
template <auto = []{ struct A{}; }>
struct B {};
Clang 和 MSVC 對這個定義很好,但 GCC 抱怨:
錯誤:
struct<lambda()>::A模板引數串列中“ ”的定義
演示:https : //gcc.godbolt.org/z/f1dxGbPvs
哪個編譯器在這里?
uj5u.com熱心網友回復:
[temp.param]/2說:
型別不應在模板引數宣告中定義。
鑒于此,GCC 拒絕此代碼是正確的:此禁止不限于型別引數的型別 ID,而是適用于模板引數宣告中的任何地方。包括嵌套在 lambda 中。
另一方面,也可以將其理解為在模板引數中禁止 lambda 本身。畢竟,lambda 運算式隱含地定義了一個型別別([expr.prim.lambda.closure]/1)。
另一方面,我們還有[expr.prim.lambda.closure]/2,它指出:
閉包型別在包含相應lambda-expression的最小塊作用域、類作用域或命名空間作用域中宣告。
這里的相關范圍似乎是命名空間范圍。這意味著應將 lambda 視為在模板引數串列之外宣告其型別。但是,lambda 體內的宣告也應該如此,并且應該允許問題中的定義。
就個人而言,我認為該禁令的范圍似乎定義不明確是標準的缺陷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/405361.html
標籤:
上一篇:禁用模板內的方法評估
下一篇:如何回圈遍歷陣列的3個元素?
