在这种情况下
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添加到第二个运算符,则代码按预期工作。
答案 0 :(得分:3)
因为对于使用转换运算符的用户定义转换,返回类型到目标类型(即char*
到bool
)的转换在对象参数后被视为转换,即将对象参数a
转换为隐式对象参数。 [over.match.best] / 1:
鉴于这些定义,可行函数
F1
被定义为a 如果适用于所有参数,则比另一个可行函数F2
具有更好的功能 i , ICS i (F1
)< / em>的转换序列不是 ICS i (F2
) ,然后
对于某些参数 j , ICS j ( { {1}} )是比 ICS j ( {更好的转换序列{1}} ),或,如果不是,
上下文是用户定义转换的初始化(见8.5,13.3.1.5和13.3.1.6)和 从
F1
的返回类型到目标类型的标准转换序列(即,类型的 正在初始化的实体)是比标准转换序列更好的转换序列 返回类型F2
到目的地类型。
因为作为引用的隐式对象参数不是F1
- F2
的引用,根据第一个项目符号点它是一个更好的匹配。
答案 1 :(得分:1)
a
是aa
的非常量实例,因此非常量转换运算符是比const值更好(精确)匹配(需要添加常量),即使返回类型不是也不配。
答案 2 :(得分:0)
你的&#34; aa&#34; object不是const,所以C ++更喜欢非const转换。
如果你做了#34; aa&#34; const,然后将使用const bool()转换运算符。