簡體   English   中英

可以在 C++ 的模板參數列表中定義類型嗎?

[英]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

哪個編譯器在這里?

[temp.param]/2說:

類型不應在模板參數聲明中定義。

鑒於此,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM