Что мне разрешено делать со статическим, инициализированным в классе элементом данных 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 переменная, чтобы вы могли в классе инициализировать его?

Ответы на вопрос(2)

Ваш ответ на вопрос