模板类+委托构造函数=字段未初始化? (整洁)

时间:2019-04-08 09:05:01

标签: 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_;
};

在此代码上运行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中的错误?

谢谢!

1 个答案:

答案 0 :(得分:3)

那肯定是假阳性。您的委派构造函数确实确实调用了另一个初始化两个字段的构造函数。但是,无论如何,我通常都会考虑为_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