我必须初始化函数局部静态常量吗?

Must I initialize function-local static consts?

我正在使用 MS Visual Studio 2017,V.15.9.8.

我使用的是优秀的 JetBrains ReSharper Ultimate 2019.1.2 Build 191.0.20190603.142841。它在指定位置给我警告:

#include <vector>
struct T
{
  std::vector<char> m;
  const char *f() const
  {
    static const char emptyData;         // ReSharper complains here
    return m.size() ? &m[0] : &emptyData;
  }
};

消息是

file.h: Static local variable of type 'const unsigned char' should be initialized. This is non-standard Microsoft C++ extension.

如果 emptyData 不是常量,则警告消失。

警告是错误的,因为所有静态数据(包括常量静态局部变量)都按照标准进行了零初始化,对吗?

我相信这是因为 const,常量变量必须被初始化,如果行是 const char emptyData;,你会得到一个未初始化的 const 变量的错误,所以我认为它是不是导致问题的 static 修饰符。

关于这件事有一个话题似乎很有趣here

无论是const static char emptyData;还是static const char emptyData;g++2a(GNU)编译器的错误是:

error: uninitialized 'const emptyData' [-fpermissive]

The warning is wrong since all static data, including constant static locals, are per the standard zero-initialized, right?

只是有点不准确。确实存在初始零初始化,但之后变量被默认初始化。对于 char,默认初始化是不初始化,在先前的零初始化的情况下,零值将保持不变。一条学究式的正确信息是(这种类型的)常量对象不能被默认初始化。

标准(最新草案说):

If a program calls for the default-initialization of an object of a const-qualified type T, T shall be a const-default-constructible class type or array thereof.

程序违反了这条规则,格式错误。

请注意,在 C++17 之前,不允许对任何 const 限定类型进行默认初始化。