您能否提供反射(reflect)以下规则的代码示例:
N3797 c++ 14,第3.6.3/2节:
最佳答案
给你:
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()
{}
首先创建
d
,但其构造函数不执行任何操作。然后,创建c
,并在其初始化过程中调用theFunction()
,这会导致初始化块范围的静态存储持续时间变量foo
。然后,在程序退出时,以相反的顺序破坏静态存储对象。因此
foo
被销毁,然后c
被销毁。最后,d
被销毁,但其析构函数调用theFunction()
,这导致控制流在已被销毁后再次达到foo
的定义。您显示的标准报价将未定义的行为归因于此。