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

问题描述 投票:0回答:3

在这种情况下

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

c++ language-lawyer overloading conversion-operator function-qualifier
3个回答
5
投票

因为对于使用转换运算符的用户定义转换,返回类型到目标类型的转换(即

char*
bool
)被视为 对象参数转换之后,即对象参数
a 的转换
隐式对象参数。 [超过匹配最佳]/1:

给定这些定义,一个可行的函数

F1
被定义为 如果对于所有参数,都比另一个可行的函数更好的函数
F2
i, ICSi (
F1
) 并不比 ICSi(
F2
) 更差,然后

  • 对于某些参数jICSj(

    F1
    )是比ICSj(
    F2
    )更好的转换序列, 或者,如果不是那样

  • 上下文是通过用户定义的转换进行的初始化(参见8.5、13.3.1.5和13.3.1.6)并且 从

    F1
    的返回类型到目标类型(即 正在初始化的实体)是比标准转换序列更好的转换序列
    F2
    到目标类型
    的返回类型。

因此,因为作为引用的隐式对象参数不是

const
operator char*
引用,因此根据第一个要点,它是更好的匹配。


1
投票

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


0
投票

你的“aa”对象不是const,所以C++更喜欢非常量转换。

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

© www.soinside.com 2019 - 2024. All rights reserved.