Порядок действий при динамической инициализации массивов - PullRequest
7 голосов
/ 05 ноября 2011

Я пролистал раздел dcl.init.aggr и не смог найти четкого ответа.

Подумайте:

static int x[2] = { f(), g() };

Говорит ли стандарт, что инициализируется первым: x [0] или x [1]?

Другими словами, какая функция запускается первой: f () или g ()?

Ответы [ 2 ]

6 голосов
/ 05 ноября 2011

Вот некоторые соответствующие выдержки из стандарта, которые отвечают на ваш вопрос:

8.5.1 / 2 "Когда агрегат инициализируется списком инициализаторов, как указано в 8.5.4, элементы списка инициализаторов берутся в качестве инициализаторов для элементов агрегата в порядке возрастания индекса или элемента. «

8.5.4 / 4 "В списке инициализаторов списка фигурных скобок предложения инициализатора, включая любые, которые являются результатом расширений пакета (14.5.3), оцениваются в порядке их появления. То есть каждое вычисление значения и побочный эффект, связанный с данным предложением инициализатора, упорядочивается перед каждым вычислением значения и побочным эффектом, связанным с любым предложением инициализатора, которое следует за ним в списке через запятую списка инициализатора. [Примечание: этот порядок оценки выполняется независимо от семантики инициализации; например, он применяется, когда элементы списка инициализатора интерпретируются как аргументы вызова конструктора, хотя обычно нет никаких ограничений последовательности аргументов вызова. —Конечная записка]

0 голосов
/ 05 ноября 2011

Если я правильно помню, стандарт не определяет порядок оценки и зависит от конкретной реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...