【问题标题】:-Wreorder and constructor initializer list-Wreorder 和构造函数初始化列表
【发布时间】:2018-06-20 13:04:11
【问题描述】:

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

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 警告:

警告:字段 'rData' 将在字段 'rP' 之后初始化 [- 重新排序]

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

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

请分享你的想法。

【问题讨论】:

  • 也许this 对你有帮助。
  • @FERNman 谢谢,这就是我正在寻找的答案。

标签: c++ constructor initializer operator-precedence


【解决方案1】:

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

不是编译器指定的,是指定的。你在这里指定它:

template<typename T>
class C{
  private:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多