请考虑以下代码:
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 const *,而非成员绑定A const&引用非const对象,它实际上根本不是转换,但在重载解析期间仅仅是非优选的情况.
当从参数类型引导到相应参数类型的路径涉及不同类型的转换时,会出现该消息.该标准拒绝将苹果与橙子进行比较,例如指针限定与参考绑定或整体提升与转换运算符,但GCC愿意.