You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:36:01