Search code examples
c++staticinitializationconstantsdefault-value

Must I initialize function-local static consts?


I'm working with with MS Visual Studio 2017, V. 15.9.8.

I am using the excellent JetBrains ReSharper Ultimate 2019.1.2 Build 191.0.20190603.142841. It gives me a warning at the indicated location:

#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;
  }
};

The message is

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

The warning disappears if emptyData is not const.

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


Solution

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

    It's just slightly inaccurate. There is initial zero initialisation indeed, but after that the variable is default initialised. For char, default initialisation is no initialisation which in case of previous zero initialisation would leave the zero value intact. A pedantically correct message would be that constant objects (of this type) must not be default initialised.

    The standard (latest draft says):

    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.

    The program violates this rule and is ill-formed.

    Note that until C++17 default initialisation was not allowed for any const qualified type.