Список инициализатора и конструктора

Я объявил шаблон класса следующим образом:

template<typename T>

class C{
public:
C(T&,
shared_ptr<C<T>>&
);
// rest of the public interface

private:

T& rData;
shared_ptr<C<T>>& rP;
};

Впоследствии я определил конструктор шаблона следующим образом:

template<typename T> C<T>::C(T& rDataArg,
shared_ptr<C<T>>& rPArg
):rData(rDataArg),
rP(rPArg)
{}

Для приведенного выше определения я получил следующее -Wreorder предупреждение от компилятора g ++:

предупреждение: поле «rData» будет инициализировано после поля «rP»
[- Wreorder]

Я изменил порядок инициализации в своем определении конструктора, и предупреждение исчезло.

Поскольку оба члена класса шаблона являются ссылками, мне любопытно, почему инициализация в конструкторе должна соответствовать порядку, указанному компилятором.

Пожалуйста, поделитесь своими мыслями.

1

Решение

Поскольку оба члена класса шаблона являются ссылками, мне любопытно, почему инициализация в конструкторе должна соответствовать порядку, указанному компилятором.

Это не указано компилятором, это указано вы. Вы указываете это прямо здесь:

template<typename T>
class C{
private:

T& rData;               // first
shared_ptr<C<T>>& rP;   // second
};

Члены всегда будут инициализированы в порядке объявления. Это общий источник ошибок, когда один заканчивается в зависимости от другого, который еще имеет неопределенное значение. Предупреждение пытается помочь вам предотвратить это. Хотя это не проблема в вашем конкретном случае, потому что члены не зависят от порядка инициализации друг друга.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]