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

使用Deducing this触发exception specification报错,是否为Clang Bug?

C++类内引用带this参数成员函数的编译兼容性问题

先看这段C++23代码:

struct A
{
    void foo(this auto &&) noexcept(true) {}
    auto bar() -> decltype(foo()) {}
};

Clang 19编译时会抛出错误:

<source>:4:28: error: exception specification is not available until end of class definition
    4 |     auto bar() -> decltype(foo()) {}
      |                            ^

但GCC和MSVC可以正常编译这段代码,以下是问题分析:

代码合法性判断

这段代码符合C++标准,Clang的报错属于编译器实现Bug。

原因解析

  1. 带this参数的成员函数是C++23引入的特性,用于更灵活地定义成员函数的this类型。
  2. 根据C++标准规则,类内成员的声明和定义按顺序处理,foo在bar之前已经完成完整定义,其异常规格(noexcept(true))在类内后续成员的上下文里应该是可见的。
  3. Clang错误地认为foo的异常规格要到类定义结束后才可用,这违背了标准中类内成员可见性的规则——对于已经定义的成员函数,其完整签名(包括异常规格)应对后续成员可见。

关于依赖this的noexcept场景

如果实际代码中noexcept需要依赖this(比如noexcept(decltype(this->some_function()))),这种写法本身符合C++23标准,但GCC存在崩溃问题(对应GCC内部Bug编号117106),这是GCC自身的实现缺陷,和代码合法性无关。

内容的提问来源于stack exchange,提问作者HolyBlackCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:24:57