-Wreorder 和构造函数初始化列表
-Wreorder and constructor initializer list
我声明了一个class模板如下:
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
警告:
warning: field 'rData' will be initialized after field 'rP'
[- Wreorder]
我颠倒了构造函数定义中的初始化顺序,警告消失了。
由于模板class的两个成员都是引用,我很好奇为什么构造函数中的初始化要遵循编译器指定的顺序。
请分享您的想法。
Since both the members of the template class are references, I am curious about why the initialization in the constructor should adhere to the order specified by the compiler.
不是编译器指定的,是你指定的。您可以在此处指定它:
template<typename T>
class C{
private:
T& rData; // first
shared_ptr<C<T>>& rP; // second
};
成员将始终按声明顺序初始化。这是错误的常见来源,当一个错误最终依赖于另一个价值不确定的错误时。该警告试图帮助您防止这种情况发生。尽管在您的特定情况下这不是问题,因为成员不依赖于彼此的初始化顺序。
我声明了一个class模板如下:
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
警告:
warning: field 'rData' will be initialized after field 'rP' [- Wreorder]
我颠倒了构造函数定义中的初始化顺序,警告消失了。
由于模板class的两个成员都是引用,我很好奇为什么构造函数中的初始化要遵循编译器指定的顺序。
请分享您的想法。
Since both the members of the template class are references, I am curious about why the initialization in the constructor should adhere to the order specified by the compiler.
不是编译器指定的,是你指定的。您可以在此处指定它:
template<typename T>
class C{
private:
T& rData; // first
shared_ptr<C<T>>& rP; // second
};
成员将始终按声明顺序初始化。这是错误的常见来源,当一个错误最终依赖于另一个价值不确定的错误时。该警告试图帮助您防止这种情况发生。尽管在您的特定情况下这不是问题,因为成员不依赖于彼此的初始化顺序。