- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我声明了一个类模板如下:
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]
我颠倒了构造函数定义中的初始化顺序,警告消失了。
由于模板类的两个成员都是引用,我很好奇为什么构造函数中的初始化要遵循编译器指定的顺序。
请分享您的想法。
最佳答案
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
};
成员将始终按声明顺序初始化。这是错误的常见来源,当一个错误最终依赖于另一个值(value)不确定的错误时。该警告试图帮助您防止这种情况发生。尽管在您的特定情况下这不是问题,因为成员不依赖于彼此的初始化顺序。
关于c++ - -Wreorder 和构造函数初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48203028/
我声明了一个类模板如下: template class C{ public: C(T&,
我有以下类(class) #include class A { protected: std::string m1; int port; public: std::string
已结束。此问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
g++ -Wall 选项包括 -Wreorder。该选项的作用如下所述。我不清楚为什么有人会关心(尤其是在 -Wall 中默认打开它)。 -Wreorder (C++ only) Warn when
查看What's the point of g++ -Wreorder ,我完全明白 -Wreorder 有什么用。但是编译器能够检测到这样的重新排序是否无害似乎也不是不合理的: struct Har
我是一名优秀的程序员,十分优秀!