Должен ли я инициализировать функцию локального stati c consts? - PullRequest
5 голосов
/ 13 января 2020

Я работаю с MS Visual Studio 2017, V. 15.9.8.

Я использую отличную версию JetBrains ReSharper Ultimate 2019.1.2 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: Stati c локальная переменная типа 'const unsigned char' должна быть инициализируется. Это нестандартное расширение Microsoft C ++.

Предупреждение исчезает, если emptyData не является постоянным.

Предупреждение является неправильным, поскольку все данные c stati, включая постоянные данные c местные жители, по стандарту инициализируются нулями, верно?

Ответы [ 2 ]

5 голосов
/ 13 января 2020

Предупреждение неверно, так как все данные stati c, включая постоянные локальные данные stati c, соответствуют стандартным инициализированным нулями, верно?

Это просто немного неточно. Инициализация начального нуля действительно есть, но после этого переменная инициализируется по умолчанию. Для char инициализация по умолчанию не является инициализацией, которая в случае предыдущей нулевой инициализации оставила бы нулевое значение без изменений. Педантически правильным сообщением будет то, что константные объекты (этого типа) не должны инициализироваться по умолчанию.

Стандарт (последний проект говорит):

Если программа вызывает по умолчанию -инициализация объекта с определенным константным типом T, T должен быть константным типом, который может быть создан по умолчанию, или его массивом.

Программа нарушает это правило и является некорректной.

Обратите внимание, что до C ++ 17 инициализация по умолчанию не была разрешена для любого типа, определенного с помощью const.

1 голос
/ 13 января 2020

Я полагаю, что из-за const переменные константы должны быть инициализированы, если строка const char emptyData;, вы получаете ошибку для неинициализированной переменной const, поэтому я думаю, что это не модификатор static, который вызывающий проблему.

Существует топи c по этому вопросу, которая кажется интересной здесь .

Будь то const static char emptyData; или static const char emptyData; ошибка в g++2a(GNU) компилятор:

ошибка: неинициализированный 'const emptyData' [-fpermissive]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...