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

显式删除的析构函数是否隐式为constexpr?能否用于constexpr上下文?

显式删除析构函数与constexpr上下文的疑问

当显式默认化析构函数(如struct s { ~s() = default; };)时,该类型仍可在constexpr上下文使用。但显式删除析构函数(如struct s { ~s() = delete; };)时,Clang判定其无法用于constexpr上下文。请问:显式删除的析构函数是否会被隐式标记为constexpr?带有这类析构函数的类型能否用于constexpr上下文?

代码示例

struct a { ~a() = default; };           // 所有编译器都通过
struct b { ~b(){} };                    // 所有编译器都失败
struct c { ~c() = delete; };            // Clang下失败
struct d { constexpr ~d() = default; }; // 所有编译器都通过
struct e { constexpr ~e(){} };          // 所有编译器都通过
struct f { constexpr ~f() = delete; };  // 所有编译器都通过

static_assert(noexcept([]<c>{}));

Clang报错信息

<source>:9:28: error: non-type template parameter has non-literal type 'c'
static_assert(noexcept([]<c>{}));
                           ^
<source>:3:12: note: 'c' is not literal because its destructor is not constexpr
struct c { ~c() = delete; };            // fails on clang
           ^

解答

1. 显式删除的析构函数是否会被隐式标记为constexpr?

根据C++标准,显式删除的析构函数不会被隐式声明为constexpr。只有满足constexpr函数要求的默认或用户定义函数,才会被隐式或显式标记为constexpr。删除的函数本身不参与函数体的合法性检查,但析构函数的constexpr属性是类型能否成为字面量类型的关键条件之一。

2. 带有这类析构函数的类型能否用于constexpr上下文?

C++标准规定,字面量类型的类必须满足:拥有constexpr析构函数(平凡析构函数属于constexpr析构函数的一种)。显式删除的析构函数既不是平凡析构函数,也不会被隐式标记为constexpr,因此对应的类不属于字面量类型,无法在要求字面量类型的constexpr场景(比如非类型模板参数)中使用。

但存在例外:如果显式删除的析构函数被显式标记为constexpr(如示例中的struct f),则它满足constexpr析构函数的要求,此时类属于字面量类型,可以正常用于constexpr上下文。

Clang的报错符合标准规范,其他编译器可能存在实现差异,但从标准层面来说,未显式标记constexpr的删除析构函数不会被隐式视为constexpr,对应的类型无法用于要求字面量类型的constexpr场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:12:20