Почему инициализация скобок C++ не поддерживается для агрегатов с закрытыми членами?

По моему мнению, следующее концептуально не нарушает конфиденциальность. Но это запрещено.

struct A
{
        int a;
        int b;
        int c;
};
struct B
{
        int a;
        int b;
private:
        int c;
};

int main (int argc, char * argv[])
{
        auto a = A{1,2,3}; //ok
        auto b = A{1,2};   //ok
        auto c = B{1,2,3}; //error
        auto d = B{1,2};   //error
        return 0;
}

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

С другой стороны, на мой взгляд, это нарушение конфиденциальности, но это разрешено стандартом.


person Patrick Fromberg    schedule 25.01.2018    source источник
comment
Вы не можете использовать агрегатную инициализацию для struct B, потому что это не агрегат (все нестатические члены агрегата должны быть общедоступными).   -  person Jerry Coffin    schedule 25.01.2018
comment
@ Джерри, да, я знаю, это то, что я говорю. Но я тоже жалуюсь на это. С какой стати стандарт усложняет вещи, которые могут быть такими простыми?   -  person Patrick Fromberg    schedule 25.01.2018
comment
Вы в основном спрашиваете, почему не члены класса не могут писать частные переменные. Это по дизайну. Связанный вопрос - это угловой случай, возможно, стандартный дефект.   -  person GManNickG    schedule 25.01.2018
comment
@GMan. Зачем рассматривать инициализацию фигурной скобки как доступ, не являющийся членом? Для меня это что-то смутно похожее на вызов конструктора. Это новый вид автоматического конструктора.   -  person Patrick Fromberg    schedule 25.01.2018
comment
Нынешние правила просты и понятны. Если бы вы разрешили агрегированную инициализацию чего-либо с закрытыми членами, что бы вы сделали с чем-то вроде class A { int a; public: int b; }; A a{1}; Используете ли вы 1 для инициализации A::a или A::b? Любой выбор оставит изрядное количество людей расстроенными и/или сбитыми с толку.   -  person Jerry Coffin    schedule 25.01.2018


Ответы (1)


Не существует агрегата с частными или защищенными нестатическими элементами данных. Все нестатические элементы данных агрегата должны быть общедоступными.

private:
    int c;

заставляет B больше не быть агрегатом. Таким образом, агрегатная инициализация больше не может работать.

person Baum mit Augen    schedule 25.01.2018
comment
ответ правильный, мой вопрос был не потому, что я хотел знать, почему стандарт сделал это ограничение. - person Patrick Fromberg; 15.07.2021