c++ - 模板类 + 委托构造函数 = 未初始化的字段?(整洁)
问题描述
我正在运行 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_;
};
在此代码上运行 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()) {}
但是,如果我从类中删除模板并使其成为普通类,则不会出现此类错误。
在模板类上使用委托构造函数时我是否缺少某些东西,或者这是 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_
。当然,除非在某些情况下,成员应该保持未初始化......
另外,请注意,第一个构造函数中的const
on 你的参数是非常没有意义的。const std::size_t size
A
推荐阅读
- error-handling - 为失败类型扩展 Result 时,为什么我得到“方法存在但不满足以下特征界限”?
- java - 有什么方法可以保证 ElasticSearch 索引已被删除
- amazon-web-services - 从 AWS EC2 实例发出 http 请求时的 ETIMEDOUT
- css - 将 div 居中在 flex 项目中
- c++ - 为什么乌尔都语字体被反向渲染?
- sql - 将 varchar 值 '2019-05-13 23:45:00' 转换为数据类型 int 时转换失败
- vue.js - 无效的道具:VueJS 中的类型检查失败错误
- java - JsonObject 抛出 com.google.gson.stream.MalformedJsonException
- mongodb - Mongoose 每隔一分钟删除所有文档,并且不接受来自 `expires` 和 `expireAfterSeconds` 的时间
- python - 按数值排序 CSV 文件