模板 class + 委托构造函数 = 字段未初始化? (叮当声)
Template class + delegating constructor = fields not initialized? (clang-tidy)
我是 运行 clang-tidy 8.0,我收到警告:
constructor does not initialize these fields:
在模板化 class 上使用委托构造函数时。我想知道这是否是我应该抑制的误报,或者我的代码是否确实是错误的。
有问题的示例代码是这样的:
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-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()) {}
但是,如果我从 class 中删除模板并将其设为普通 class,那么我就不会收到此类错误。
在模板化 class 上使用委托构造函数时,我是否遗漏了什么,或者这是 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_;
};
因为这使得添加另一个构造函数的人更难忘记初始化 data_
。当然,除非在某些情况下成员应该保持未初始化状态……
此外,请注意 A
is quite pointless.
的第一个构造函数中 const std::size_t size
参数上的 const
我是 运行 clang-tidy 8.0,我收到警告:
constructor does not initialize these fields:
在模板化 class 上使用委托构造函数时。我想知道这是否是我应该抑制的误报,或者我的代码是否确实是错误的。
有问题的示例代码是这样的:
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-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()) {}
但是,如果我从 class 中删除模板并将其设为普通 class,那么我就不会收到此类错误。
在模板化 class 上使用委托构造函数时,我是否遗漏了什么,或者这是 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_;
};
因为这使得添加另一个构造函数的人更难忘记初始化 data_
。当然,除非在某些情况下成员应该保持未初始化状态……
此外,请注意 A
is quite pointless.
const std::size_t size
参数上的 const