假设具有以下类定义:
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
在传递给函数1和2之前是否向下转换为int
?