Почему я получаю эту ошибку "неверная инициализация неконстантной ссылки типа 'A &' из значения типа A" - PullRequest
0 голосов
/ 27 июня 2018

С учетом следующего кода:

#include <iostream>
using std::ostream;

class A {
    int x;
public:
    A(int x) :
            x(x) {
    }
    A& operator+=(const A& a) {
        this->x = this->x + a.x;
        return *this;
    }
    friend ostream& operator<<(ostream& os, const A& a);

};

A operator+(const A& a1, const A& a2) {
    return A(a1) + a2;
}

ostream& operator<<(ostream& os, const A& a) {
    return os << a.x;
}

int main() {
    const A a1(2);
    A& sum = a1 + a1; // error**************
    std::cout << sum;
}

Я получаю следующую ошибку:

неверная инициализация неконстантной ссылки типа «A &» из значения типа «A»

Но я не понимаю, в чем причина этой ошибки. В общем, я получаю новый объект от operator+ и определяю ссылку (sum) на этот объект, так в чем же проблема? И как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018
A operator+(const A& a1, const A& a2)

Возвращает свежий объект (анонимный временный) типа A.

A& sum = a1 + a1;

Вы пытаетесь привязать это временное значение к (неконстантной) ссылке; таким образом, пытаясь создать ссылку на объект, срок жизни которого подходит к концу. Надеюсь, это не разрешено в C ++. Вам действительно нужно " сохранить " этот объект где-нибудь:

A sum = a1 + a1;

Особый случай:

A const& sum = a1 + a1;

Когда временная привязка связана с const-ссылкой, время жизни этого объекта увеличивается до времени жизни ссылки. Это полезно для аргумента функции, но не рекомендуется здесь.

0 голосов
/ 27 июня 2018

A ссылка не может привязаться к анонимному временному. И a1 + a1 является анонимным временным.

Из интереса можно связать ссылку const, поэтому const A& sum = a1 + a1; разрешено. Кроме того, в этом конкретном случае время жизни этого временного объекта увеличивается до времени жизни ссылки (хотя важно отметить, что это не переходный ).

...