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