不应声明 "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 可以是 constexpr
或 consteval
因为它有一个 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
.
通过使用 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 可以是 constexpr
或 consteval
因为它有一个 non-static 类型的数据成员 std::vector
所以 ~Foo
必须在某个时候调用 delete[]
来释放向量的存储空间。
那么为什么 SonarLint 会显示此消息?是因为 = default
吗?是否有任何 defaulted 特殊成员函数隐式变为 constexpr
?
是:
An explicitly-defaulted function that is not defined as deleted may be declared
constexpr
orconsteval
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
.