Named Aggregate initialization

dix75
dix75

На текущий момент имеем.

struct user
{
    uint32_t id_{};
    std::string name_= "Ivan";
    std::string surname_= "Sidorov";
};

user u1{10, "Alice", "Si"};

 

Улучшить предлагаю так:

struct user
{
    uint32_t id_{};
    std::string name_= "Ivan";
    std::string surname_= "Sidorov";
};

user u0;
user u1{id_ = 10, name_ =  "Alice", surname_ = "Si"};
user u2{id_ = 10};
user u3{surname_ = "Si"};

p.s. Затруднений в реализации не вижу, может быть они есть, хотелось бы узнать.

3
рейтинг
4 комментария
Andrey Davydov
Может быть тогда лучше адаптировать С99 designated initializers? На это есть proposal open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0329r0.pdf (я не знаю его судьбу).
Основной контраргумент, как я понимаю, в том что это потенциально приводит к не полностью инициализированным объектам (в Вашем примере, все поля имеют значения по умолчанию, но обычно это не так). Возможно Вас заинтересует обсуждение на stackoverflow: stackoverflow.com/questions/18731707/why-does-c11-not-support-designated-initializer-list-as-c99
Andrey Davydov
dix75
Andrey Davydov, "это потенциально приводит к не полностью инициализированным объектам"
Эта ситуация характерна для С++ в общем случае, в отличии от С# , поэтому не вижу здесь проблемы.
dix75
Andrey Davydov
dix75, Не совсем так, в C++ есть удобные способы инициализировать поля: конструкторы, aggregate initalization, zero initialization. Давайте рассмотрим следующую ситуацию:
struct X
{
int a, b;
};

X x0; // x0.a, x0.b are not initialized
X x1 { 1, 2 }; // x1.a, x1.b are initialized
X x2 {}; // x2.a, x2.b are zero initialized
X x3 { .a = 5 }; // x3.a is initialized, x3.b is not initialized (C99)

Мне не нравится, что x3.b не будет инициализировано, в то время как поля x2 будут.
Andrey Davydov
dix75
Andrey Davydov,
что не совсем, так?
Я в своем посте говорю, что сейчас существует возможность инициализовать некоторые и не инициализировать другие.

struct X
{
int a = 10;
int* y;
};
X x;
Частично инициализованный объект.
dix75
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).