2

Скажите, что я хочу обратиться к члену initializer_list, который я уже определил. Могу ли я это сделать?Могу ли я ссылаться на предыдущие члены списка инициализаторов?

Этот код компилируется и дает ожидаемое: «13 55» как в Visual Studio и gcc, я просто хотел бы знать, что это законно:

const int foo[2] = {13, foo[0] + 42}; 
+0

@ShafikYaghmour Хотя этот вопрос также ссылается на 'initializer_list' он делает это в формате структуры, а не в виде массива. В ответах есть краткие упоминания массивов, но все они направлены на связанные с конструкцией ответы, которые (потенциально) инициализируются совершенно другим методом. На мой взгляд, это * не * дубликат, и я, конечно же, хотел бы увидеть некоторый анализ того, является ли он законным в контексте массива. –

+0

@NathanOliver Хотя этот вопрос также ссылается на 'initializer_list', он делает это в формате структуры, а не в формате массива. В ответах есть краткие упоминания массивов, но все они направлены на связанные с конструкцией ответы, которые (потенциально) инициализируются совершенно другим методом. На мой взгляд, это * не * дубликат, и я, конечно же, хотел бы увидеть некоторый анализ того, является ли он законным в контексте массива. –

+0

Я вновь открылся, поскольку можно утверждать, что ответ для массива может быть не совсем тем, что было в другом вопросе. У меня есть вырубка любого ответа, который вы получите, будет выглядеть очень похоже. – NathanOliver

ответ

5

Итак, что мы имеем здесь покрыт агрегатная инициализацию в разделе 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}; 
Смежные вопросы