我有:

struct DisplayConfig {
    int width;
    int height;
    int colorDepth;
};

另一个合计:
struct DisplayResolution {
    int width;
    int height;
};

我希望我们喜欢他们:
DisplayResolution resolution{1920, 1080};
DisplayConfig config{r, 32};

哪个不起作用。

DisplayConfig更改为:
struct DisplayConfig {
    DisplayResolution resolution;
    int colorDepth;
};

可以,但是不能更改DisplayConfig,也不能再访问config.width
DisplayConfig{r.width, r.height, 32};确实可行,但正税类似于:
DisplayConfig config{r, 32};

可能?

最佳答案

不,根据您的条件,这是不可能的:“不能更改DisplayConfig”。DisplayConfig类确实满足了聚合的条件(在C++ 14中),因为它没有用户提供的构造函数,没有私有(private)或 protected 非静态数据成员,没有基类,也没有虚函数。

当通过初始化列表初始化此类聚合时,适用以下条件:



因此,在以下语句中:

DisplayConfig config{r, 32};
r被用作DisplayConfigwidth的第一个成员的初始化程序。由于转换失败,这将导致错误:
error: cannot convert 'DisplayResolution' to 'int' in initialization
     DisplayConfig config{ r, 32 };
                             ^

和警告,因为没有给initt初始化器depth类的DisplayConfig成员:
warning: missing initializer for member 'DisplayConfig::colorDepth' [-Wmissing-field-initializers]

关于c++ - 用另一个聚合对象初始化聚合列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55060695/

10-11 19:59