帮助我理解这一点......看到大胆。从标准3.6.3终止(2)
2如果函数包含静态或线程的块范围对象 已销毁的存储持续时间并调用该函数 在使用静态或线程存储破坏对象期间 持续时间,如果控制流程,程序有未定义的行为 通过先前被破坏的blockcope的定义 对象即可。同样,如果块范围对象,则行为未定义 在销毁之后间接使用(即通过指针)。
Manager& GetManager()
{
static Manager localMan;
return localMan;
}
然后在其他地方......
{
static User localUser;
localUser.DoSomething(); //localUser calls GetManager and uses the reference returned.
}
然后在User析构函数中......
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对象被破坏,然后再次调用该函数(创建新静态或不创建),这是未定义的吗?看起来它为已定义的行为留下了空间,但是如果它通过了被破坏对象的定义则不是。
任何人都清楚地了解这一点吗?
答案 0 :(得分:2)
我相信这里的关键词是
创建新的静态
如果在破坏静态对象期间发生这种情况,并且会导致重新创建一些已经被破坏的静态对象,那么何时它们会被销毁?如果它导致循环怎么办?系统应该如何跟踪所有这些?这些可能带来的好处值得吗?
可能不是,因为语言标准明确决定不定义它。