class Rational {
const Rational operator*(const Rational& rhs) const
...
};
Rational oneHalf(1,2);
Rational result = oneHalf * 2; // fine (with non-explicit ctor)
result = 2 * oneHalf; // error! (even with non-explicit ctor)
scott meyers在Effective C ++的书中提到了如下
即使Rationl的构造函数不明确,一个编译,一个不编译。原因如下:
事实证明,只有当参数列在参数列表中时,参数才有资格进行隐式转换。
对应于调用成员函数的对象的隐式参数 - “this”指向的那个 - 是 永远不符合隐式转换的条件。这是第一次调用编译而第二次调用没有。
我的问题是作者在上述声明中的含义“只有它们列在参数列表中”?什么是参数列表?
答案 0 :(得分:5)
编写运算符时,请尝试根据显式函数调用来考虑它。
Rational oneHalf(1, 2);
Rational result = oneHalf.multiply(2); // Ok, can convert
Rational result = 2.multiply(oneHalf); // OWAIT, no such function on int.
由于int上没有这样的运算符,编译器不知道如何处理oneHalf以使调用工作,并抛出错误。在这种情况下,“参数列表”是运算符的参数。你需要做一个免费的功能。
答案 1 :(得分:0)
他的意思是可以隐式转换函数参数,但是永远不会隐式转换为函数形成*this
的东西。
答案 2 :(得分:0)
我的问题是作者的意思 在上述声明中“只有他们是 在参数列表中列出“?什么 是参数列表?
他的意思是构造函数中的参数列表:
class Rational
{
public:
Rational (int a); // <-- here 'a'
Rational (double b); //<-- here 'b'
};
如果您的班级中有这两个构造函数,那么您可以编写
Rational result1 = oneHalf * 2; //2 is int, so it converts into Rational(2)
Rational result2 = oneHalf * 2.9; //2.9 is double, so it converts into Rational(2.9)