Почему неявное приведение от объекта к ссылке разрешено? - PullRequest
0 голосов
/ 01 июля 2018

Давайте рассмотрим пример:

Foo& Foo::operator+=(Foo val)
{
    // logic...
    return *this;
}

Foo operator+(Foo v1, Foo v2)
{
    return v1+=v2;
}

Если выражение v1+=v2 имеет тип Foo&, почему оно может использоваться как возвращаемое значение функции, возвращающей Foo? Где исполнен актерский состав? Имеет ли значение тот факт, что operator+= реализован как член Foo, какая разница?

1 Ответ

0 голосов
/ 01 июля 2018

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

Foo operator+(Foo v1, Foo v2) {
    Foo ret(v1+=v2); // << This is done implicitly
    return ret;
}
...