使用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。
原因解析
- 带
this参数的成员函数是C++23引入的特性,用于更灵活地定义成员函数的this类型。 - 根据C++标准规则,类内成员的声明和定义按顺序处理,
foo在bar之前已经完成完整定义,其异常规格(noexcept(true))在类内后续成员的上下文里应该是可见的。 - Clang错误地认为
foo的异常规格要到类定义结束后才可用,这违背了标准中类内成员可见性的规则——对于已经定义的成员函数,其完整签名(包括异常规格)应对后续成员可见。
关于依赖this的noexcept场景
如果实际代码中noexcept需要依赖this(比如noexcept(decltype(this->some_function()))),这种写法本身符合C++23标准,但GCC存在崩溃问题(对应GCC内部Bug编号117106),这是GCC自身的实现缺陷,和代码合法性无关。
内容的提问来源于stack exchange,提问作者HolyBlackCat
相关产品推荐
相关产品推荐

