Итак, что мы имеем здесь покрыт агрегатная инициализацию в разделе 8.5.1
проекта стандарта C++, и он говорит:
агрегат представляет собой массив или класс [...]
и:
Когда агрегат инициализируется списком инициализатора, как указано в 8.5., элементы списка инициализатора воспринимаются как инициализаторах для членов совокупности, в увеличении или индекс порядок членов. Каждый член копирования инициализируется из соответствующего инициализатора-п [...]
Проблема в том, что, хотя это кажется разумным, что побочные эффекты от инициализации каждого члена совокупности должны быть упорядочены до следующего, так как каждый элемент в списке инициализаторов является полным выражением. Стандарт фактически не гарантирует этого мы можем видеть это из defect report 1343, который говорит:
Действующая редакция не указывает, что инициализация объекта неклассовую является полным выражением, но по-видимому, должны сделать это.
, а также отмечает:
Совокупные инициализации может также включать в себя более одного полного самовыражение, поэтому ограничение выше «инициализация внеклассовой объекта» не является правильным.
и мы можем видеть из родственного std-discussion topic Ричарда Смита говорит:
[intro.execution] p10:. «Полное выражение является выражением, которое не подвыражения другого выражения [ ...] Если языковая конструкция определена для получения неявного вызова функции, использование языковой конструкции считается выражением для целей этого определения ».
Поскольку бит-init-list не является выражением, и в этом случае это не приводит к вызову функции, а 5 и s.i являются отдельными полными выражениями. Тогда:
[intro.execution] p14: «Каждое вычисление значения и побочный эффект , связанные с полной экспрессией секвенировали перед каждым значением вычисления и побочный эффект, связанный со следующей полной экспрессией быть оценен.? "
Так что единственный вопрос, является побочным эффектом инициализации си „связана с“оценкой полного выражения„5“Я думаю, что единственное разумное предположение, что: если 5 были инициализируя член класса , вызов конструктора, очевидно, был бы частью полного выражения по определению в [intro.execution] p10, поэтому вполне естественно предположить, что то же самое верно для скалярных типов.
Тем не менее, я не думаю, что стандарт фактически прямо говорит об этом .
Так что это в настоящее время не указано стандартом и на него нельзя положиться, хотя я был бы удивлен, если бы реализация не рассматривалась так, как вы ожидаете.
Для простого случая, как этот что-то похожее на это, кажется, лучший вариант:
constexpr int value = 13 ;
const int foo[2] = {value, value+42};
@ShafikYaghmour Хотя этот вопрос также ссылается на 'initializer_list' он делает это в формате структуры, а не в виде массива. В ответах есть краткие упоминания массивов, но все они направлены на связанные с конструкцией ответы, которые (потенциально) инициализируются совершенно другим методом. На мой взгляд, это * не * дубликат, и я, конечно же, хотел бы увидеть некоторый анализ того, является ли он законным в контексте массива. –
@NathanOliver Хотя этот вопрос также ссылается на 'initializer_list', он делает это в формате структуры, а не в формате массива. В ответах есть краткие упоминания массивов, но все они направлены на связанные с конструкцией ответы, которые (потенциально) инициализируются совершенно другим методом. На мой взгляд, это * не * дубликат, и я, конечно же, хотел бы увидеть некоторый анализ того, является ли он законным в контексте массива. –
Я вновь открылся, поскольку можно утверждать, что ответ для массива может быть не совсем тем, что было в другом вопросе. У меня есть вырубка любого ответа, который вы получите, будет выглядеть очень похоже. – NathanOliver