我必须初始化函数局部静态常量吗?
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 限定类型进行默认初始化。
我正在使用 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 限定类型进行默认初始化。