Следующий код компилируется на всех компиляторах, которые я протестировал до сих пор: < /p>
struct Alignment {
struct Center {
constexpr Center() {}
};
static const Center CENTER;
};
constexpr int foo(Alignment::Center) {
return 42;
}
constexpr int x = foo(Alignment::CENTER);
Обратите внимание, что выравнивание :: center не contexpr здесь. У него даже нет определения, только объявление. Тем не менее, я использую его в качестве аргумента для foo для вычисления contexpr переменная x .
Как только я добавляю член к выравниванию :: center , он не может компилировать:
struct Center {
int n;
constexpr Center(): n(0) {}
};
< /code>
Является ли первый пример действительно действительным в соответствии со стандартом C ++? Какие именно правила здесь? Стандартная гарантия того, что пустые структуры всегда являются постоянными выражениями?struct Center {
int n;
constexpr Center(): n(0) {}
constexpr Center(const Center&): n(0) {}
};
Подробнее здесь: https://stackoverflow.com/questions/797 ... xpressions