这是一个糟糕的C ++风格还是编辑器错误?

时间:2016-09-04 13:47:53

标签: c++ c++11

我在新的C ++编辑器中有这个代码我正在尝试(CLion):

 struct screenPoint {
        float x = 0, y = 0;
        screenPoint(float x_, float y_): x{x_}, y{y_}{}
    };

    struct position {
        screenPoint ul; 
        float width = 0, height = 0;
        position(screenPoint p, float w, float h): ul{p},width{w},height{h}{}
    };

接近结尾是初始化语句ul{p},我认为这是使用大括号初始化的有效C ++方式。但是,克里昂抱怨道:

Incompatible types in initialiser: Types 'float' and 'screenPoint' are not compatible.

注意:没有编译器错误或警告,代码按预期工作。

如果我将其更改为ul(p),则错误消失。

现在,我知道screenPoint没有接受另一个screenPoint的构造函数,但在初始化时是否需要这样的?

2 个答案:

答案 0 :(得分:3)

这是编辑错误。使用相同类型的元素进行列表初始化应该调用隐式复制构造函数。

有关于尝试复制聚合的核心语言缺陷(1467),但这不是聚合。

答案 1 :(得分:2)

肯定是克里昂的问题。在跟踪器中有它:https://youtrack.jetbrains.com/issue/CPP-6939