您能否提供反射(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的定义。

您显示的标准报价将未定义的行为归因于此。

09-11 17:51