在运算符情况下的C ++ const转换

考虑下面的代码:

struct A {
    void operator++() const {}
};

void operator++(const A&) {}


int main () {
    const A ca;
    ++ca; // g++ Error (as expected): ambiguous overload for ‘operator++’

    A a;
    ++a; // g++ Warning: "ISO C++ says that these are ambiguous,
         // even though the worst conversion for the first is better
         // than the worst conversion for the second"
         // candidate 1: void operator++(const A&)
         // candidate 2: void A::operator++() const
}

为什么g ++只在++a上发出警告而不是错误? 换句话说, 非成员函数如何比成员函数更适合?

谢谢!


如果我是猜测,成员函数导致从一个指针资格转换A *A const *初始化时this ,而所述非成员结合的A const &参照一个非const对象,它不是一个真正的变换但在重载解决方案中仅仅是一种非优选的情况。

当从参数类型到相应参数类型的路径涉及不同类型的转换时,会出现该消息。 该标准拒绝将苹果与桔子进行比较,例如指针限定与参考绑定或整体提升与转换操作符,但GCC愿意。


在c ++中,你可以为const和not分开方法(和运算符),当你不这样做时,编译器可以搜索“最适合” 。 不是const的最合适的是const。

看看这个例子:

struct S{
  void f(){cout<<"f";}
  void f()const{cout<<"f-const";}
};

int main(){
   const S sc;
   S s;
   s.f();
   sc.f();
   return 0;
}

第一次印刷的输出将是“f”,但第二次印刷的输出将是“f-const”

如果我从结构中删除非const方法,我将得到两个对象的相同输出。 这是因为该函数被称为“ 最适合 ”,因为它可以将“恒定”添加到非常量对象。 (不能删除const方法,因为它根本不适合......)

在你的代码中, 没有明确的操作符不是const,所以当它寻找“ 最适合 ”时,它可以从选项中选择,并采取看起来最好的。 你有一个警告,因为有两个适合,但仍然选择其中之一,我不知道为什么一个看起来更好,然后另一个...但对于常量它有两个显式函数 ,编译器无法选择何时有明确的方法! 这就是为什么你有错误。

如果你想要相同的行为,也可以添加显式的非const运算符,如下所示:

struct A {
    void operator++() const {}
    void operator++(){};
};

void operator++(const A&) {}
void operator++(A&) {}

现在你会得到两个相同的错误。

链接地址: http://www.djcxy.com/p/19467.html

上一篇: C++ const conversion in the case of operators

下一篇: wordpress featured image from external url without download