我声明了一个类模板如下:
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)
{}
对于上面的定义,我从g ++编译器得到以下-Wreorder
警告:
警告:字段&#39; rData&#39;将在字段&#39; rP&#39;之后初始化。 [ - Waleorder]
我在构造函数定义中颠倒了初始化的顺序,警告消失了。
由于模板类的两个成员都是引用,我很好奇为什么构造函数中的初始化应该遵循编译器指定的顺序。
请分享您的想法。
答案 0 :(得分:2)
由于模板类的两个成员都是引用,我很好奇为什么构造函数中的初始化应该遵循编译器指定的顺序。
它没有由编译器指定,它由你指定。你在这里指定它:
template<typename T>
class C{
private:
T& rData; // first
shared_ptr<C<T>>& rP; // second
};
会员将始终按声明顺序初始化。这是一个常见的错误来源,当一个人最终取决于另一个仍然具有不确定价值的错误时。警告正试图帮助您防止这种情况发生。虽然在您的特定情况下这不是问题,因为成员不依赖于彼此的初始化顺序。