首页 > 解决方案 > C++17“静态内联”是否解决了静态初始化顺序惨败?

问题描述

我偶尔会遇到“C++静态初始化顺序惨败”,其中一些复杂的全局对象(如哈希表)在构造之前被另一个类使用,有时会导致在进入main()之前初始化时崩溃。

众所周知,可以通过将需要初始化的对象部分作为静态对象嵌入成员函数中来避免这种惨败,因为函数中的静态对象总是在第一次进入函数时被初始化,例如:

struct GlobalHashTable
{
   std::map <std::string, int>& stringmap()
   {
       static std::map <std::string, int> stringmap;
       
       return stringmap;
   }

... (remainder safely uses stringmap() to get at properly-initialized map object)
};

似乎“静态内联”对象与这些嵌入在函数中的对象具有相似的语义。它们可以在避免惨败的同时安全地在课堂上使用吗?

例如,

struct GlobalHashTable
{
   static inline std::map <std::string, int> stringmap;

... (remainder safely uses stringmap to get at properly-initialized map object)
};

标签: c++staticinitializationc++17

解决方案


推荐阅读