我正在运行clang-tiy8.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_;
};在此代码上运行clang时:
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()) {}但是,如果我从类中删除模板并使其成为一个普通类,那么我就不会得到这样的错误。
在模板化的类上使用委托构造函数时,我是否遗漏了一些东西,或者这是clang中的一个bug?
谢谢!
发布于 2019-04-08 09:15:09
那肯定是假阳性。您的委托构造函数确实调用了另一个构造函数,该构造函数初始化两个字段。但是,无论如何,我会考虑只为_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_;
};因为这使得任何添加另一个构造函数的人都更难忘记初始化data_。当然,除非在某些情况下,成员应该保持未初始化的…。
还要注意,在const is quite pointless的第一个构造函数中,const std::size_t size参数上的A。
https://stackoverflow.com/questions/55569776
复制相似问题