C ++重载决策,转换运算符和常量

时间:2015-01-29 20:45:44

标签: c++ overloading language-lawyer conversion-operator const-method

在这种情况下

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

3 个答案:

答案 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)

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

答案 2 :(得分:0)

你的&#34; aa&#34; object不是const,所以C ++更喜欢非const转换。

如果你做了#34; aa&#34; const,然后将使用const bool()转换运算符。