Использование struct Initializer для присвоения значений переменным-членам publi c не вызывает ошибку компилятора? - PullRequest
2 голосов
/ 01 февраля 2020

В следующем коде C ++, почему инициализатор структуры, используемый с оператором присваивания, не генерирует ошибку компилятора?

Это ошибка компилятора?

Будет ли он работать на каждом компиляторе?

Что это за задание на самом деле?

class vector2D
{
    public :
        double x,y;
};

int main()
{
    vector2D v1;
    v1 = {1,2} ; // why does this compile and work?
}

Ответы [ 3 ]

5 голосов
/ 01 февраля 2020

Это ошибка компилятора?

Нет.

Будет ли он работать на каждом компиляторе?

Он будет компилироваться на всех C ++ 11 (или более поздних) совместимых компиляторах.

Какой тип назначения это на самом деле?

Это назначение из временного объекта, созданного с инициализацией списка.

1 голос
/ 01 февраля 2020

Когда у класса нет явно определенного оператора присваивания, существует неявно определенный оператор.

В вашем случае существует неявно определенный оператор присваивания копии в форме

vector2D& operator=(vector2D const& rhs);

Вы можете использовать любое выражение в правой части такого назначения, если оно может быть преобразовано в vector2D const&. В вашем случае {1, 2} действительно удовлетворяет этому требованию. По этой причине

v1 = {1,2};

в порядке. Это как если бы вы использовали:

v1 = vector2D{1,2};
1 голос
/ 01 февраля 2020

Правая часть назначения может быть braced-init-list : она преобразуется в значение некоторого соответствующего типа (обычно это тип левой стороны) для назначения. То, что он может быть преобразован таким образом, является просто агрегатной инициализацией, как даже C в некоторой форме всегда (и как составные литералы в последнее время).

...