5

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

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;
    ...
};

这是消息的描述声明一个函数或一个静态成员变量 constexpr 使其隐式内联。

我不认为此类的 dtor 可以是constexpr,或者consteval因为它具有类型的非静态数据成员,std::vector因此~Foo必须在某些时候调用delete[]以释放向量的存储空间。

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

4

1 回答 1

5

是的:

可以声明未定义为已删除的显式默认函数,constexpr或者consteval仅当它与 constexpr 兼容([特殊],[class.compare.default])。 在其第一个声明中显式默认的函数是隐式内联 ([dcl.inline]),如果它是 constexpr 兼容的,则它是隐式 constexpr ([dcl.constexpr])。

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

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

于 2022-01-07T16:40:12.247 回答