Шаблонный класс + делегирующий конструктор = поля не инициализированы?(Лязг-аккуратный) - PullRequest
2 голосов
/ 08 апреля 2019

Я использую 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 Ответ

3 голосов
/ 08 апреля 2019

Это определенно ложный позитив. Ваш делегирующий конструктор действительно вызывает другой конструктор, который инициализирует оба поля. Тем не менее, я бы в любом случае рассмотрел просто использование инициализатора по умолчанию для _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_. Если, конечно, в некоторых случаях член должен оставаться неинициализированным & hellip;

Также обратите внимание, что const в параметре const std::size_t size в первом конструкторе A совершенно бессмысленно .

...