Что мне разрешено делать со статическим, инициализированным в классе элементом данных constexpr?
Вероятно, это немного необычный вопрос, поскольку он требует более полного объяснения короткого ответа, данногоДругой вопрос и некоторых аспектов стандарта C ++ 11, связанных с ним.
Для удобства я подведу здесь упомянутый вопрос. ОП определяет класс:
struct Account
{
static constexpr int period = 30;
void foo(const int &) { }
void bar() { foo(period); } //no error?
};
и задается вопросом, почему он не получает ошибки об использовании инициализированного в классе статического члена данных (в книге упоминается, что это незаконно). В ответе Йоханнеса Шауба говорится, что:
Это нарушаетОдно правило определения;Диагностика не требуется.Несмотря на то, что я полагаюсь на источник и достоверность этого ответа, мне, честно говоря, не нравится его, потому что я лично нахожу его слишком загадочным, поэтому я попытался выработать более значимый ответ сам, с частичным успехом. Соответствующим представляется пункт 9.4.2 / 4:
«Должно быть одно определение статического члена данных,УСО используемый (3.2) в программе;Диагностика не требуется" [Акценты мои]
Что приближает меня к сути. И вот как § 3.2 / 2 определяетУСО используемый переменная:
«Переменная, имя которой появляется в качестве потенциально вычисляемого выражения, используется в odrесли это объект, который удовлетворяет требованиям для появления в константном выражении (5.19)а также преобразование lvalue в rvalue (4.1) применяется немедленно " [Акценты мои]
В вопросе ОП переменнаяperiod
четко удовлетворяет требованиям для появления в постоянном выражении, будучиconstexpr
переменная. Так что причина, безусловно, должна быть найдена ввторой условие:"и преобразование lvalue в rvalue (4.1) немедленно применяется".
Вот где у меня проблемы с интерпретацией стандарта.Что на самом деле означает это второе условие? Какие ситуации это охватывает? Означает ли это, что статическийconstexpr
переменнаяне odr-used (и, следовательно, может быть инициализирован в классе), если он возвращается из функции?
В более общем смысле:Что вам разрешено делать со статическимconstexpr
переменная, чтобы вы могли в классе инициализировать его?