在这种情况下
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 添加到第二个运算符,那么代码当然会按预期工作。
因为对于使用转换运算符的用户定义转换,返回类型到目标类型的转换(即char*
to bool
) 被认为after对象参数转换,即对象参数的转换a
到隐式对象参数。 [超过匹配最佳]/1:
Given these definitions, a viable function F1
is defined to be a
better function than another viable function F2
if for all arguments
i, ICSi (F1
) is not a worse conversion sequence than ICSi(F2
), and then
for some argument j, ICSj(F1
) is a better conversion sequence than ICSj(F2
), or, if not that,
上下文是通过用户定义的转换进行的初始化(参见 8.5、13.3.1.5 和 13.3.1.6)和
从返回类型的标准转换序列F1
到目标类型(即
正在初始化的实体)是比标准转换序列更好的转换序列
返回类型F2
到目的地类型.
因为隐式对象参数是一个引用,而不是一个const
- 参考operator char*
,根据第一个要点,这是一个更好的匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)