C++20是否允许在decltype或sizeof表达式内定义类型?
问题结论
Clang的行为符合C20标准规范,GCC当前的报错属于实现缺陷,未正确适配C20的规则。
标准依据说明
- C++20起正式允许lambda出现在不求值语境中,包括
decltype、sizeof操作符的操作数范围内。 - 标准中「类型不允许定义在
decltype/sizeof表达式内」的限制,仅针对直接写在操作数顶层作用域的类型定义(例如decltype(struct S{});属于明确非法写法),而lambda函数体属于独立的内部作用域,在其中定义类型不受该规则限制。
示例代码说明
你给出的代码是完全符合C++20语法要求的合法代码:
using T = decltype( []{ struct S{}; return S{}; } ); [[maybe_unused]] constexpr auto N = sizeof( []{ struct S{}; return S{}; } );
GCC的错误是错误将lambda内部的类型定义识别为了decltype/sizeof表达式顶层的类型定义,沿用了旧标准的检查逻辑,没有匹配C++20的新规则。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

