通过使用 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会使其隐式成为内联函数。我认为此类的析构函数不能是constexpr
或consteval
,因为它有一个类型为std::vector
的非静态数据成员,所以~Foo
必须在某个时刻调用delete[]
来释放向量的存储空间。
那么为什么SonarLint会显示这条消息呢?是因为= default
吗?任何默认的特殊成员函数都会隐式地成为constexpr
吗?
~Foo() = default;
被视为定义,因此它将自动进行内联。 - NathanOliverm_Matrix
,那么它们应该被=default
,并且可以选择删除已删除的复制操作,因为当您具有自定义(或默认)移动操作时,它们会自动删除。或者,如果您不介意类可复制,您可以同时删除复制和移动操作。 - HolyBlackCat