帮助我理解这一点......看粗体。从标准 3.6.3 终止 (2)
2 如果函数包含已销毁的静态或线程存储持续时间的块范围对象,并且在具有静态或线程存储持续时间的对象的销毁期间调用该函数,则如果控制流通过,则程序具有未定义的行为先前销毁的块作用域对象的定义。同样,如果块范围对象在其销毁后被间接使用(即,通过指针),则行为未定义。
Manager& GetManager()
{
static Manager localMan;
return localMan;
}
然后在别的地方...
{
static User localUser;
localUser.DoSomething(); //localUser calls GetManager and uses the reference returned.
}
然后在用户析构函数中......
User::~User()
{
GetManager().DoSomethingOneLastTime();
}
//Now lets say Main exits and static destruction begins.
//Somehow localMan is destructed before User.
//Then user calls the GetManager() function in it's destructor.
//What case is this defined, and what case makes this undefined?
标准是否说如果使用 odr-use 规则静态创建的本地静态 localMan 对象被破坏,然后再次调用该函数(是否创建新的静态),这是未定义的?看起来它为定义的行为留出了空间,但如果它通过了被破坏对象的定义,则不是。
有人对此有明确的见解吗?