我已经阅读了下面的规则,并一直在尝试编写一个反映该规则的示例。 该规则来自于3.8/5 N3797:
在对象的存储空间被分配但对象的生命周期开始之前,或者在对象的生命周期结束并且对象占用的存储空间被重新使用或释放之前,可以使用指向对象将要或曾经占用的存储位置的任何指针,但是仅限于有限的方式。对于正在构建或销毁的对象,请参见12.7。否则,这样的指针引用已分配的存储(3.7.4.2),并且将指针用作类型为“void *”是可以定义的。通过这样的指针间接寻址是允许的,但得到的左值只能以限定的方式使用,如下所述。如果程序出现以下情况,则具有未定义行为:
[...]
— 使用指针访问对象的非静态数据成员或调用非静态成员函数,或
[...]
我所编写的示例:
#include <iostream>
#include <typeinfo>
using std::cout;
using std::endl;
struct A
{
int b = 5;
static const int a = 5;
};
int main()
{
A *p = (A*)0xa31a3442;
cout << p -> a; //1, Well-fromed, there is no compile-time error
cout << p -> b; //2, Segmentation fault is producing
}
//1
是良好形式并且不会导致任何UB
,但//2
却导致了分段错误,这是否属于UB
?