4

在这种情况下

void f(int *);
void f(const int *);
...
int i;
f(&i);

情况很清楚 - f(int *) 被调用,这似乎是正确的。

但是,如果我有这个(错误地这样做了(*)):

class aa
{
public:
    operator bool() const;
    operator char *();
};

void func(bool);

aa a;
func(a);

运算符 char *() 被调用。我无法弄清楚为什么这样的决策路径会比使用运算符 bool() 更好。有任何想法吗?

(*) 如果将 const 添加到第二个运算符,则代码当然可以按预期工作。

4

3 回答 3

5

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

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

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

  • 上下文是通过用户定义的转换(参见 8.5、13.3.1.5 和 13.3.1.6)进行的初始化F1,并且从比从返回类型F2到目标类型的标准转换序列更好的转换序列

因此,因为隐式对象参数(即引用)不是 的const-reference operator char*,所以根据第一个要点,它是更好的匹配。

于 2015-01-29T20:57:23.263 回答
1

a是一个非常量实例,aa因此非常量转换运算符比常量转换运算符(需要添加常量)更好(精确)匹配,即使返回类型也不匹配。

于 2015-01-29T20:51:07.920 回答
0

您的“aa”对象不是 const,因此 C++ 更喜欢非常量转换。

如果您将“aa”设为 const,则将使用 const bool() 转换运算符。

于 2015-01-29T20:51:14.637 回答