Предположим, у нас есть следующее определение класса:
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?