[英]Can a type be defined inside template parameter list in C++?
在模板struct B
的以下定義中,使用 lambda 作為非類型模板參數的默認值,並且在 lambda 的主體中定義了一些類型A
:
template <auto = []{ struct A{}; }>
struct B {};
Clang 和 MSVC 對這個定義很好,但 GCC 抱怨:
錯誤:'
struct<lambda()>::A
' 在模板參數列表中的定義
演示: https://gcc.godbolt.org/z/f1dxGbPvs
哪個編譯器在這里?
類型不應在模板參數聲明中定義。
鑒於此,GCC 拒絕此代碼是正確的:此禁止不限於類型參數的類型 ID ,而是適用於模板參數聲明中的任何地方。 包括嵌套在 lambda 內。
另一方面,也可以將其理解為在模板參數中禁止 lambda 本身。 畢竟,lambda 表達式隱式定義了 class 類型( [expr.prim.lambda.closure]/1 )。
另一方面,我們也有[expr.prim.lambda.closure]/2 ,其中指出:
閉包類型在最小塊 scope、class scope 中聲明,或命名空間 Z31A1FD140BE4BEF2D11E121Z-表達式包含對應的lambda 表達式
這里相關的 scope 似乎是命名空間 scope。 這意味着 lambda 應被視為其類型在模板參數列表之外聲明。 但是,lambda 體內的聲明也應該如此,並且應該允許問題中的定義。
就個人而言,我認為這是標准中的缺陷,該禁令的 scope 似乎定義不清。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.