首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类+委托构造函数=字段未初始化?(叮当-整齐)

模板类+委托构造函数=字段未初始化?(叮当-整齐)
EN

Stack Overflow用户
提问于 2019-04-08 09:05:01
回答 1查看 2.5K关注 0票数 10

我正在运行clang-tiy8.0,我收到了警告:

constructor does not initialize these fields:

在模板化类上使用委托构造函数时。我想知道这是否是我应该抑制的假阳性,或者我的代码是否确实是错误的。

所讨论的示例代码如下:

代码语言:javascript
复制
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

除其他外,我得到的是:

代码语言:javascript
复制
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?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-08 09:15:09

那肯定是假阳性。您的委托构造函数确实调用了另一个构造函数,该构造函数初始化两个字段。但是,无论如何,我会考虑只为_data使用默认的初始化程序:

代码语言:javascript
复制
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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55569776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档