在下面的 template 定義中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 拒絕這段代碼是正確的:這個禁令不限于型別引數的type-id,而是適用于模板引數宣告中的任何地方。包括嵌套在 lambda 中。
另一方面,人們也可能將其理解為在模板引數中禁止 lambdas 本身。畢竟,一個 lambda 運算式隱式地定義了一個型別別([expr.prim.lambda.closure]/1)。
另一方面,我們還有[expr.prim.lambda.closure]/2,它指出:
閉包型別在包含相應lambda-expression的最小塊作用域、類作用域或命名空間作用域中宣告。
這里的相關范圍似乎是命名空間范圍。這意味著 lambda 應該被視為它的型別是在模板引數串列之外宣告的。但是,lambda 主體內的宣告也應該如此,并且應該允許問題中的定義。
就個人而言,我認為該禁令的范圍似乎如此不明確是標準中的一個缺陷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403453.html
標籤:
