我声明了一个类模板,如下所示:
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]
我在构造函数定义中颠倒了初始化的顺序,警告消失了。
由于模板类的两个成员都是引用,所以我很好奇为什么构造函数中的初始化应遵循编译器指定的顺序。
请分享您的想法。
由于模板类的两个成员都是引用,所以我很好奇为什么构造函数中的初始化应遵循编译器指定的顺序。
它不是由编译器指定的,而是由您指定的。您在此处指定它:
template<typename T>
class C{
private:
T& rData; // first
shared_ptr<C<T>>& rP; // second
};
成员将始终通过声明顺序进行初始化。当一个错误最终取决于另一个不确定价值的错误时,它是常见的错误来源。警告试图帮助您防止这种情况。尽管在您的特定情况下这不是问题,因为成员不依赖于彼此的初始化顺序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句