Pet*_*ica 6 c++ static initialization constants default-value
我正在使用 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;
}
};
Run Code Online (Sandbox Code Playgroud)
消息是
file.h:应该初始化类型为“const unsigned char”的静态局部变量。这是非标准的 Microsoft C++ 扩展。
如果emptyData不是 const ,警告就会消失。
警告是错误的,因为所有静态数据,包括常量静态局部变量,都是按照标准的零初始化,对吧?
警告是错误的,因为所有静态数据,包括常量静态局部变量,都是按照标准的零初始化,对吧?
只是有点不准确。确实有初始零初始化,但之后变量默认初始化。对于char,默认初始化是没有初始化,在之前的零初始化的情况下,零值将保持不变。一个迂腐正确的消息是常量对象(这种类型)不能被默认初始化。
标准(最新草案说):
如果程序要求对具有常量限定的类型 T 的对象进行默认初始化,则 T 应为可常量默认构造的类类型或其数组。
该程序违反了此规则并且格式错误。
请注意,在 C++17 之前,任何 const 限定类型都不允许默认初始化。