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)
Run Code Online (Sandbox Code Playgroud)
scott meyers在Effective C++的书中提到了如下
即使Rationl的构造函数不明确,一个编译,一个不编译.原因如下:
事实证明,只有当参数列在参数列表中时,参数才有资格进行隐式转换.
与调用成员函数的对象相对应的隐式参数 - "this"指向的对象 - 永远不能进行隐式转换.这是第一次调用编译而第二次调用没有.
我的问题是作者在上述声明中的意思是"只有它们列在参数列表中"?什么是参数列表?
编写运算符时,请尝试根据显式函数调用来考虑它.
Rational oneHalf(1, 2);
Rational result = oneHalf.multiply(2); // Ok, can convert
Rational result = 2.multiply(oneHalf); // OWAIT, no such function on int.
Run Code Online (Sandbox Code Playgroud)
由于int上没有这样的运算符,编译器不知道如何处理oneHalf以使调用工作,并抛出错误.在这种情况下,"参数列表"是运算符的参数.你需要做一个自由的功能.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |