Назначенные инициализаторы, где функция взята из C. Большинство компиляторов C++ также являются компиляторами C, и сначала это была функция C.
Они добавили ограничение (чтобы инициализаторы были в порядке) и применили его к типам C++, которые соответствуют типам C, и перенесли его в C++. Большинство основных компиляторов C++ уже имели его как расширение C++ (без ограничений); ограничение было проверено разработчиками компилятора как разумное, и тогда стоимость добавления функции была очень низкой.
Когда у вас есть конструктор, это становится более серьезной языковой проблемой. Ссылается ли инициализатор на аргументы конструктора? Если да, мы сталкиваемся с проблемой, что имена аргументов не уникальны. Если нет, то как нам справиться с этим, когда конструктор устанавливает значение, а инициализатор устанавливает другое значение?
По сути, нам нужны аргументы функции по имени, чтобы получить разумные назначенные инициализаторы с конструкторами. И это новая функция, а не просто взятая из C.
Обходной путь (для именованных аргументов):
struct RawPoint{
int x = 0;
int y = 0;
int z = 0;
};
struct Point {
Point( int x_, int y_, int z_ = 0 ):
x(x_), y(y_), z(z_)
{}
explicit Point( RawPoint pt ):
Point( pt.x, pt.y, pt.z )
{}
int x, y, z;
};
то вы можете сделать:
Point pt( {.x=3} );
путем доступа к назначенной функции инициализации RawPoint
.
Точно так же вы можете назначить инициализаторы в вызовах функций.
Это также работает:
struct Point:RawPoint {
Point( int x, int y, int z = 0 ):
RawPoint{x,y,z}
{}
explicit Point( RawPoint pt ):
RawPoint( pt )
{}
};
person
Yakk - Adam Nevraumont
schedule
10.11.2020