您能否提供反映以下规则的代码示例:
N3797 c ++ 14,第3.6.3/2节:
如果函数包含已销毁的静态或线程存储持续时间的块范围对象,并且在销毁具有静态或线程存储持续时间的对象期间调用该函数,则如果控制流通过该程序,则该程序具有未定义的行为.先前销毁的块范围对象的定义.
Rei*_*ica 10
这个给你:
void theFunction()
{
static std::unique_ptr<int> foo { new int(42) };
}
struct Creator
{
Creator() { theFunction(); }
};
struct Destroyer
{
~Destroyer() { theFunction(); }
};
Destroyer d;
Creator c;
int main()
{}
Run Code Online (Sandbox Code Playgroud)
d首先创建,但它的构造函数什么都不做.然后,c创建并作为其初始化的一部分进行theFunction()调用,这将导致块范围的static-storage-duration变量foo被初始化.
然后,在程序退出时,静态存储对象以相反的构造顺序销毁.所以foo被摧毁了,然后c.最后,d被破坏,但是它的析构函数调用theFunction(),这导致控制流程foo在已经被销毁之后再次达到定义.
您显示的标准引用归因于此未定义的行为.