Ответ 1
Это недопустимо С++.
Он (вроде) использует пару функций из C, известных как "составные литералы" и "назначенные инициализаторы", которые несколько компиляторов С++ поддерживают как расширение. "Тип" исходит из того факта, что для того, чтобы быть законным C-составным литералом, у него должен быть синтаксис, похожий на приведение, так что у вас есть что-то вроде:
return (RasterInfo) {
.offset = 0,
.length = 1,
.stretch_cycles = (_width - 1) * 4,
.repeat_lines = 1000,
};
Независимо от различий в синтаксисе, однако, он в основном создает временную структуру с элементами, инициализированными как указано в блоке, поэтому это примерно эквивалентно:
// A possible definition of RasterInfo
// (but the real one might have more members or different order).
struct RasterInfo {
int offset;
int length;
int stretch_cycles;
int repeat_lines;
};
RasterInfo rasterize(unsigned, Pixel *target) {
*target = color;
RasterInfo r { 0, 1, (_width-1)*4, 1000};
return r;
}
Большая разница (как вы можете видеть) заключается в том, что назначенные инициализаторы позволяют вам использовать имена членов, чтобы указать, какой инициализатор переходит к тому, что является членом, а не зависит только от порядка/позиции.