Могут ли элементы массива инициализироваться самостоятельно?
Да.
struct c {
int a[3];
c() : a{4, a[0], 3} {} // a[0] is initialized to 4.
// a[1] is initialized to whatever a[0] is. (4)
// a[2] is initialized to 3.
};
Но рассмотрим следующий пример:
struct c {
int a[3];
c() : a{a[1], 4, a[1]} {} // a[0] is initialized to whatever a[1] is.(Garbage value)
// a[1] is initialized to 4.
// a[2] is initialized to what a[1] is now (4).
};
Здесь первый элемент в a
будет любое значение в a[1]
, , который, скорее всего, будет значение мусора. Второй элемент инициализирован до 4
, а третий элемент инициализируется , что теперь находится в a[1]
, что является значением 4
.
Кроме того, если вы не перечислить все элементы массива внутри {}
, элементов, которые не перечислены, будет дефолт инициализирован:
struct c {
int a[5]; // notice the size
c() : a{a[1], 2, 3, 4}{} // a[0] will get value that is in a[1]
// but since a[1] has garbage value,
// it will be default initialized to 0.
// a[1] = 2
// a[2] = 3
// a[3] = 4
// a[4] is not listed and will get 0.
};
Однако, перечисляя элемент уже инициализирован будет дайте вам то значение, которое вы хотите.
Использование приведенного выше примера:
struct c {
int a[5];
c() : a{1, a[0], 3, 4}{} // a[0] = 1
// a[1] = 1
// a[2] = 3
// a[3] = 4
// a[4] is not listed and will get 0.
};
Моя первая мысль - «не делать». Моя вторая мысль - «инициализатор списков havr ordering gurantees». Моя третья мысль: «инициализация происходит после оценки аргумента, нет?» – Yakk