-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 
};

成员将始终按声明顺序初始化。这是错误的常见来源,当一个错误最终依赖于另一个价值不确定的错误时。该警告试图帮助您防止这种情况发生。尽管在您的特定情况下这不是问题,因为成员不依赖于彼此的初始化顺序。