Приводит ли инициализация статического члена данных глобальной константой к неопределенному поведению? - PullRequest
1 голос
/ 06 марта 2019

Я столкнулся с изумительным ответом этого Т. ( edit: который я сейчас считаю неправильным ) и у меня есть дополнительный вопрос. Пожалуйста, рассмотрите код, в котором я использую постоянно инициализируемые константные переменные целочисленных типов, объявленные в глобальной области пространства имен, чтобы либо постоянно инициализировать постоянные статические члены данных, либо объявлять члены массива данных моих классов. Пример для лучшей иллюстрации:

const int internal_linkage_constant = 1;

class ExternalLinkageClass
{
  static const int constexpr_value = internal_linkage_constant; // #1
  int arr[internal_linkage_constant];                           // #2
};

Определения всех этих классов находятся в заголовочных файлах и могут быть общими для нескольких единиц перевода. Глобальные константы должны быть определены до этих определений и по своей природе не могут иметь внешнюю связь для использования в константных выражениях . Теперь мой вопрос: приводят ли такие инициализации к неопределенному поведению из-за нарушения ODR?

1 Ответ

2 голосов
/ 06 марта 2019

Нет, без исключения.Стандарт C ++ 98 гласит в главе 3.2, что:

В программе может быть несколько определений типа класса (…) при условии, что каждое определение появляется в отдельной единице перевода,и при условии, что определения удовлетворяют следующим требованиям:

  • каждое определение D должно состоять из одной и той же последовательности токенов;и
  • в каждом определении D, соответствующие имена, просмотренные в соответствии с 3.4, должны относиться к объекту, определенному в определении D, или должны ссылаться на тот же объект после разрешения перегрузки (13.3) и послесоответствие частичной специализации шаблона (14.8.3), , за исключением того, что имя может ссылаться на const-объект с внутренней связью или без нее, если объект имеет один и тот же тип целого или перечисления во всех определениях D, и объект инициализированс постоянным выражением (5.19) и значением (но не адресом) объекта, и объект имеет одинаковое значение во всех определениях D ;
  • (…)
...