Что такое назначенный инициализатор? - PullRequest
1 голос
/ 13 июля 2020

Я хочу sh, чтобы понять, что предоставляют назначенные инициализаторы, отличные от прямой инициализации.

Например:

#include <iostream>

struct Subject{

    int x;
    int y;
    int z;

};

int main()
{ 
    Subject subject_d{.x = 1, .y = 2, .z= 3};
    Subject subject_c{1, 2, 3};

    return 0;
}

Как мы можем декортифицировать эти две строки? В чем разница для дотошных?

Ответы [ 3 ]

5 голосов
/ 13 июля 2020

В опубликованном вами примере нет абсолютно никакой разницы в поведении. Агрегат инициализируется для хранения тех же трех значений. С точки зрения удобочитаемости можно утверждать, что назначенная версия инициализатора более четко описывает происходящее. Его также можно использовать для документирования. Предполагаемое значение каждого инициализатора (при условии, что мы правильно назвали элементы) написано прямо рядом с ним.

За пределами явной инициализации. Назначенные инициализаторы также хорошо сочетаются с другими функциями C ++. Рассмотрим вместо этого.

struct Subject{
    int x = 0;
    int y = 0;
    int z = 0;
};

Вы можете написать

Subject const s { .y = 2 };

We go со значением по умолчанию для всех полей, кроме y. А переменная s - const, потому что мы не хотим ее менять. Это хорошо с точки зрения корректности констант.

Вы можете добиться аналогичного эффекта без обозначенных инициализаторов, но это потребует гораздо большего количества шаблонов, если мы хотим, чтобы s оставалось константой, и, возможно, это было бы не так лаконично и ясно. Вот почему их так приятно иметь на языке.

2 голосов
/ 13 июля 2020

эта строка:

Subject subject_d{.x = 1, .y = 2, .z= 3};

она больше не будет компилироваться, если вы переименуете хотя бы одно из полей или измените их порядок, чтобы эта форма была «безопасной»

, но

Subject subject_c{1, 2, 3};

не предполагает имя полей, поэтому, если вы поменяете их порядок, инициализация каждого поля будет не такой же, но тихо

1 голос
/ 13 июля 2020

Две строки семантически эквивалентны. Один из двух более явный, что может привести к меньшему количеству программных ошибок.

...