Скажем, у меня есть этот класс:порядок вычисления аргументов конструктору
struct A
{
A(int, int, int) {}
};
и я инициализировать его следующим образом:
A{ a(), b(), c() };
Где функции a()
, b()
и c()
возвращают int
. Должно ли a()
вызывать до b()
и b()
до c()
?
Я озадачен следующим пунктом от стандарта (8.5.4 [dcl.init.list] p4):
В рамках инициализатора-лист в рамно-Init-списка, initializer- , в том числе любые результаты из пакетов (14.5.3), оцениваются в том порядке, в котором они отображаются. То есть вычисление каждого значения и побочный эффект , связанный с заданным предложением инициализатора, секвенируются перед каждым вычислением значения и боковым эффектом , связанным с любым предложением инициализатора, которое следует за ним в списке списка инициализаторов, разделенных запятыми. [Примечание: это упорядочение оценки выполняется независимо от семантики инициализации; например, применяется , когда элементы списка инициализатора интерпретируются как аргументы вызова конструктора, хотя обычно не имеют ограничений последовательности для аргументов вызова. - конечная нота]
В соответствии с цитатой функции будут вызываться в порядке их появления, но когда я проверил это с моим компилятором (g ++ - 4.8.1), он не выполнялся. Я что-то неправильно понял?
Спасибо, принимая список инициализации в конструкторе, как представляется, обходной путь. – user1095108