Возвращаемый тип при перегрузке оператора - PullRequest
1 голос
/ 16 марта 2019

Предположим, у нас есть следующее определение класса:

template <typename T> class Foo {
public:
    T x;
    Foo(T x): {x = 1;}
} 

И для перегрузки следующих функций:

// function 1
Foo<T> operator*(T s) const {
    return Foo<T>(x*s);
}

// function 2
Foo<T> &operator*=(T s) {
    x *= s;
    return *this;
}

Теперь я создаю экземпляр объекта:

Foo<float> foo;
float y = 2.2;

Затем бинарный оператор foo * y возвращает объект типа Foo<float>, поскольку y равен float.Если бы вместо этого y было типа int, foo * y вернул бы объект типа Foo<int>, потому что y - это int.В этом случае, даже если x*s возвращает float, он будет преобразован в int конструктором.

Заключение : bar имеет тип Foo<T>где T - это тип скаляра, на который я умножаю foo.


Теперь рассмотрим оператор присваивания *=.Затем foo *= y возвращает ссылку на foo.

Заключение : независимо от типа y, foo будет по-прежнему иметь тип Foo<float>.

Не могли бы вы поправить меня, если я ошибаюсь?Кроме того, что если я напишу:

Foo<int> foo;
float y = 2.2;

аргумент y понижается до int перед передачей в функцию 1 & 2?

...