C++ 重载解析、转换运算符和 const

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 添加到第二个运算符,则代码当然会按预期工作。

Col*_*mbo 5

因为对于使用转换运算符的用户定义转换,在对象参数转换之后考虑将返回类型转换为目标类型(即char*to bool),即对象参数到隐式对象参数的转换。[over.match.best]/1:a

鉴于这些定义,如果对于所有参数 iICS i ( )不是比ICS i ( )更差的转换序列,那么一个可行函数F1被定义为比另一个可行函数更好的函数,然后F2 F1F2

  • 对于某些参数jICS j ( F1)是比ICS j ( F2)更好的转换序列,或者,如果不是

  • 上下文是通过用户定义转换的初始化(见 8.5、13.3.1.5 和 13.3.1.6),从返回类型 ofF1到目标类型(即被初始化实体的类型F2的标准转换序列是一个比从返回类型到目标类型的标准转换序列更好的转换序列

因此,由于作为引用的隐式对象参数不是constfor的引用operator char*,因此根据第一个要点,它是更好的匹配。