重新排序成员声明
Reordering member declaration
c++标准中引用了3.3.7/1:
如果对类中的成员声明重新排序会产生另一个有效程序在(1)和(2)下,程序是病态的,没有诊断必需的。
这是什么意思?你能找到一个这样的重新排序声明的例子吗?
考虑这个程序:
double foo;
class Bar {
std::vector<decltype(foo)> v;
int foo;
};
重新排序 Bar::v
和Bar::foo
如下:
double foo;
class Bar {
int foo;
std::vector<decltype(foo)> v;
};
将产生一个在其他方面有效的替代程序,因此该程序违反了引用的规则。
(一个版本的)gcc选择在第一种情况下发出错误,但使用第二种变体("no diagnostic is required")进行编译。
std::vector<decltype(::foo)> v;
和std::vector<decltype(Bar::foo)> v;
是有效的替代(后者只有在首先声明Bar::foo
时才有可能)。
这种情况的一个例子是您可以在对象构造中得到的常见错误。代码变体1和2说明了这一点。代码变体1:
class C
{
C() : a1(0), a2(a1)
{
}
int a1;
int a2;
};
代码变体2:
class C
{
C() : a1(0), a2(a1)
{
}
int a2;
int a1;
};
注意,在变量2 a1和a2中,成员的声明顺序被改变了。好的编译器会对代码变体2提供警告:"成员初始化不符合声明顺序"。问题是,在代码变体2程序行为是未定义的。一些编译器将生成a2将初始化为0的代码(例如,据我猜测Visual Studio编译器),一些将生成a2值未定义的代码,而在代码变体1中,任何编译器都会提供正确的代码。这就是你需要的例子
相关文章:
- 使用静态成员声明类时遇到问题
- 错误 C2059:语法错误:从结构成员声明'constant'
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- C++ 成员声明中不允许使用限定名称
- 又一个"未找到成员声明"
- auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
- C++错误:成员声明末尾的预期“;”
- 静态成员声明 c++11
- 如何将成员声明为指向外部"C"函数的指针?
- C++11 - 将非静态数据成员声明为 'auto'
- 类成员声明的快捷方式
- libclang 获取成员声明
- 将成员声明与enable_if一起使用
- 找不到成员声明
- C++错误:找不到成员声明
- 找不到c++成员声明
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 将struct的成员声明为uint32_t时额外的字节
- 为什么类的大小取决于成员声明的顺序?以及如何
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许