模板 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