Gor*_*vic 4 c++ overloading conversion-operator language-lawyer const-method
在这种情况下
void f(int *);
void f(const int *);
...
int i;
f(&i);
Run Code Online (Sandbox Code Playgroud)
情况很清楚 - f(int *) 被调用,这似乎是正确的。
但是,如果我有这个(错误地这样做了(*)):
class aa
{
public:
operator bool() const;
operator char *();
};
void func(bool);
aa a;
func(a);
Run Code Online (Sandbox Code Playgroud)
运算符 char *() 被调用。我不明白为什么这样的决策路径比使用 operator bool() 更好。有任何想法吗?
(*) 如果将 const 添加到第二个运算符,则代码当然会按预期工作。
因为对于使用转换运算符的用户定义转换,在对象参数转换之后考虑将返回类型转换为目标类型(即char*to bool),即对象参数到隐式对象参数的转换。[over.match.best]/1:a
鉴于这些定义,如果对于所有参数 i,ICS i ( )不是比ICS i ( )更差的转换序列,那么一个可行函数
F1被定义为比另一个可行函数更好的函数,然后F2F1F2
对于某些参数j,ICS j (
F1)是比ICS j (F2)更好的转换序列,或者,如果不是,上下文是通过用户定义转换的初始化(见 8.5、13.3.1.5 和 13.3.1.6),从返回类型 of
F1到目标类型(即被初始化实体的类型F2)的标准转换序列是一个比从返回类型到目标类型的标准转换序列更好的转换序列。
因此,由于作为引用的隐式对象参数不是constfor的引用operator char*,因此根据第一个要点,它是更好的匹配。