-Wreorder和构造函数初始化列表

时间:2018-01-11 08:55:08

标签: c++ constructor initializer operator-precedence

我声明了一个类模板如下:

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]

我在构造函数定义中颠倒了初始化的顺序,警告消失了。

由于模板类的两个成员都是引用,我很好奇为什么构造函数中的初始化应该遵循编译器指定的顺序。

请分享您的想法。

1 个答案:

答案 0 :(得分:2)

  

由于模板类的两个成员都是引用,我很好奇为什么构造函数中的初始化应该遵循编译器指定的顺序。

它没有由编译器指定,它由指定。你在这里指定它:

template<typename T>
class C{
  private:

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

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