静态内联变量需要在main之前初始化吗?

tow*_*120 5 c++ language-lawyer

如果我有以下A.h文件(仅标题):

#pragma once

struct A{
  static inline struct Initializer{
     Initializer(){
        std::cout << "init A" << std::endl;
     }
  } initializer;
};
Run Code Online (Sandbox Code Playgroud)

在之前调用#include "A.h"(来自另一个标头,该标头将包含在 main.cpp 中)是否足够?Initializer::Initializer()main()

我读到该标准要求仅在使用之前使用动态初始化来初始化静态变量。

命名空间范围的对象的动态初始化(8.5、9.4、12.1、12.6.1)是否在 main 的第一条语句之前完成,是由实现定义的。如果初始化被推迟到 main 的第一个语句之后的某个时间点,则它应在首次使用与要初始化的对象相同的翻译单元中定义的任何函数或对象之前发生。

算不算#include“使用”?

Bar*_*rry 4

最新的工作草案在[basic.start.dynamic]/5中有更明确的措辞:

具有静态存储持续时间的非局部内联变量的动态初始化是在 main 的第一个语句之前排序还是延迟,是由实现定义的。如果它被推迟,那么它强烈发生在该变量的任何非初始化 odr 使用之前。它是由实现定义的,其中的线程以及程序中的哪些点发生这种延迟的动态初始化。

在哪里:

非初始化 odr 使用是不是由非本地静态或线程存储持续时间变量的初始化直接或间接引起的 odr 使用 ([basic.def.odr])。


因此,回答你的问题:

#include "Ah" (来自另一个标头,将包含在 main.cpp 中)因此Initializer::Initializer()在 main() 之前调用是否足够?

不,#include还不够。您必须实际使用它。