【发布时间】:2022-01-11 03:00:08
【问题描述】:
在模板struct B的以下定义中,lambda用作非类型模板参数的默认值,并且在lambda的主体中定义了一些类型A:
template <auto = []{ struct A{}; }>
struct B {};
Clang 和 MSVC 对此定义很好,但 GCC 抱怨:
错误:在模板参数列表中定义“
struct<lambda()>::A”
演示:https://gcc.godbolt.org/z/f1dxGbPvs
哪个编译器在这里?
【问题讨论】:
-
这应该没问题。在 lambda 中定义结构并不会阻止它成为文字类型,这足以让它用作非类型模板参数。此外,GCC 的错误信息是可疑的。这与在模板参数列表中定义类型时得到的消息相同,这是不允许的 gcc.godbolt.org/z/9PdxG8jKE 所以我认为这可能是 GCC 产生了解析错误。
-
gcc 也接受带有类型定义的独立 lambda:
auto l = []{ struct A{}; };- 所以,一种解决方法:gcc.godbolt.org/z/v1sfoqdMv
标签: c++ templates lambda language-lawyer