Инициализируйте первые n членов только структуры или массива - PullRequest
5 голосов
/ 17 февраля 2020

Я использую компилятор clang (думаю, c ++ 11), который поставляется с RAD studio 10.2. По ошибке я обнаружил сегодня, что первые n членов структуры или массива могут быть назначены с использованием обычных фигурных скобок, например

int a[500]={1};
struct {int a,b,c;} st={2,3};

Выше скомпилировано и работает нормально, но я никогда не сталкивался с этим и не видел его раньше, и я не могу найти упоминания об этом в Интернете (возможно, я ищу, используя неправильный тип формулировки). Документируется ли это с ++?

Ответы [ 2 ]

7 голосов
/ 17 февраля 2020

Для Совокупная инициализация ,

(выделено мной)

Если количество предложений инициализатора меньше, чем число членов and bases (since C++17) или список инициализаторов полностью пуст, остальные элементы and bases (since C++17) инициализируются by their default member initializers, if provided in the class definition, and otherwise (since C++14) пустыми списками в соответствии с обычными правилами инициализации списка (которые выполняют инициализацию значения для не классовых типов и неагрегированных классов с конструкторами по умолчанию и агрегатной инициализации для агрегатов).

Это означает, что для int a[500]={1}; 1-й элемент инициализируется в 1 а остальные 499 элементов массива инициализируются значением 0. Для struct {int a,b,c;} st={2,3}; элемент a инициализируется на 2, а b инициализируется на 3, последний элемент c также инициализируется значением 0.

6 голосов
/ 17 февраля 2020

Я никогда не сталкивался с этим и не видел его раньше, и я не могу найти упоминания об этом в Интернете (возможно, я ищу, используя неправильный тип формулировки). Задокументировано ли это с ++?

Да, это задокументировано. Этот синтаксис называется инициализацией списка - и более конкретно, поскольку типы являются агрегатами: это инициализация агрегатов.

Инициализация первых n членов только структуры или массива

Это невозможно инициализировать только некоторые элементы / элементы. Если вы перечислите инициализирующий объект класса или массив, то все они будут инициализированы. Элементы / элементы, в которых отсутствует инициализатор, будут инициализированы значением.

Если вы хотите это сделать, то вместо этого вы можете по умолчанию инициализировать объект класса или массив, а затем выборочно инициализировать дочерние объекты.

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