不应声明 "constexpr" 函数 "inline"

A "constexpr" function should not be declared "inline"

通过使用 SonarLint 分析代码,我得到了一条消息(问题的标题)关于一个 destructor 声明如下:

class Foo
{
public:
.   // default ctor
.   // parameterized ctor
.
    inline ~Foo() = default; // dtor
.
.   // copy ctor = delete
.   // copy assignment operator = delete
.   // move ctor
.   // move assignment operator

private:
    ...
    mutable std::vector< std::vector<char> > m_Matrix;
    ...
};

这是 message's description声明函数或静态成员变量 constexpr 使其隐式内联。

我不认为这个 class 的 dtor 可以是 constexprconsteval 因为它有一个 non-static 类型的数据成员 std::vector所以 ~Foo 必须在某个时候调用 delete[] 来释放向量的存储空间。

那么为什么 SonarLint 会显示此消息?是因为 = default吗?是否有任何 defaulted 特殊成员函数隐式变为 constexpr

是:

An explicitly-defaulted function that is not defined as deleted may be declared constexpr or consteval only if it is constexpr-compatible ([special], [class.compare.default]). A function explicitly defaulted on its first declaration is implicitly inline ([dcl.inline]), and is implicitly constexpr ([dcl.constexpr]) if it is constexpr-compatible.

(来自 Explicitly defaulted functions,强调我的。)

Foo 在 C++20 中可能与 constexpr 兼容,因为 std::vector 现在可以是 constexpr.