9

我正在运行 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 中的错误?

谢谢!

4

1 回答 1

6

这绝对是一个误报。您的委托构造函数确实调用了另一个初始化两个字段的构造函数。但是,无论如何,我会考虑只使用默认初始化程序_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_。当然,除非在某些情况下,成员应该保持未初始化......

另外,请注意,第一个构造函数中的conston 你的参数是非常没有意义的。const std::size_t sizeA

于 2019-04-08T09:15:09.967 回答