use*_*113 8 c++ c++11 clang-tidy
我正在运行 clang-tidy 8.0 并且收到警告:
constructor does not initialize these fields:
在模板化类上使用委托构造函数时。我想知道这是否是我应该压制的误报,或者我的代码是否确实是错误的。
有问题的示例代码是这样的:
template<typename T>
class A
{
public:
explicit A(const std::size_t size) :
data_(nullptr),
data_size_(size)
{
// ...
}
explicit A(const std::vector<T>& b) :
A(b.size())
{
// ...
}
private:
T* data_;
std::size_t data_size_;
};
Run Code Online (Sandbox Code Playgroud)
在此代码上运行 clang-tidy 时:
clang-tidy-8 --checks=* test.cpp
我得到,除其他外:
warning: constructor does not initialize these fields: data_ [cppcoreguidelines-pro-type-member-init]
explicit A(const std::vector<T>& b) : A(b.size()) {}
Run Code Online (Sandbox Code Playgroud)
但是,如果我从类中删除模板并使其成为普通类,则不会出现此类错误。
在模板化类上使用委托构造函数时,我是否遗漏了什么,或者这是 clang-tidy 中的错误?
谢谢!
这绝对是误报。您的委托构造函数确实调用了另一个初始化两个字段的构造函数。但是,我会考虑_data在一般情况下只使用默认初始值设定项:
template<typename T>
class A
{
public:
explicit A(std::size_t size) :
data_size_(size)
{
// …
}
explicit A(const std::vector<T>& b) :
A(b.size())
{
// …
}
private:
T* data_ = nullptr;
std::size_t data_size_;
};
Run Code Online (Sandbox Code Playgroud)
因为这使得任何添加另一个构造函数的人都更难忘记 initialize data_。当然,除非在某些情况下成员应该保持未初始化状态……
另外,请注意,const在您const std::size_t size的第一个构造函数中的参数A 是毫无意义的。
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |