В соответствии со стандартным документом n4296 С++:
[dcl.init.list] (8.5.4.4) (pg223-224)
В списке инициализаторов списка с привязкой-инициализацией инициализатор-предложения, в том числе любые из результатов расширения пакета (14.5.3), оцениваются в том порядке, в котором они появляются. То есть, вычисление каждого значения и побочный эффект, связанный с данным Параметр инициализатор секвенирован перед каждым вычислением значения и побочный эффект, связанный с любым предложением инициализатора, которое следует за ним в список списков инициализаторов, разделенных запятыми. [Примечание: это порядок оценки выполняется независимо от семантики инициализация; например, оно применяется, когда элементы initializer-list интерпретируются как аргументы вызова конструктора, даже если обычно нет ограничений последовательности на аргументы вызова. -end note]
(акцент мой)
Примечание было добавлено здесь: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1030
Это говорит мне, что следующий код:
#include <iostream>
struct MyType {
MyType(int i, int j, int k, int l)
: sum(i + j + k + l)
{
}
int sum;
};
int main()
{
int i = 0;
std::cout << MyType{ ++i, ++i, ++i, ++i }.sum << '\n';
}
Должен напечатать "10".
Это мои рассуждения:
- MyType инициализируется через список с привязкой
- braced-init-lists оцениваются в порядке
- даже если он интерпретируется как аргументы вызова конструктора
- это означает, что он должен быть оценен как MyType (1,2,3,4)
То есть приведенный выше код должен вести себя точно так же, как этот код:
#include <initializer_list>
#include <iostream>
int main()
{
int i = 0;
std::initializer_list<int> il{++i, ++i, ++i, ++i};
std::cout << *il.begin() + *(il.begin() + 1) + *(il.begin() + 2) + *(il.begin() + 3) << '\n';
}
Но это не так. Первый пример печатает "16", а второй пример печатает "10"
Буквально каждый компилятор от каждого поставщика, который я могу получить отпечатков "16", по-видимому, игнорируя эту часть стандарта и не вставляя точки последовательности.
Что мне здесь не хватает?
Примечание. Следующие вопросы относятся к этому вопросу: