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

use*_*113 8 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_;
};
Run Code Online (Sandbox Code Playgroud)

在此代码上运行 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()) {}
Run Code Online (Sandbox Code Playgroud)

但是,如果我从类中删除模板并使其成为普通类,则不会出现此类错误。

在模板化类上使用委托构造函数时,我是否遗漏了什么,或者这是 clang-tidy 中的错误?

谢谢!

Mic*_*zel 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_;
};
Run Code Online (Sandbox Code Playgroud)

因为这使得任何添加另一个构造函数的人都更难忘记 initialize data_。当然,除非在某些情况下成员应该保持未初始化状态……

另外,请注意,const在您const std::size_t size的第一个构造函数中的参数A 是毫无意义的