在具有常量引用作为成员的类中使用复制和交换习语时,会发生上述错误。
示例代码:
#include <iostream>
#include <functional>
using std::reference_wrapper;
class I_hold_reference;
void swap(I_hold_reference& first, I_hold_reference& second);
class I_hold_reference{
inline I_hold_reference(const int& number_reference) : my_reference(number_reference){}
friend void swap(I_hold_reference& first, I_hold_reference& second);
inline I_hold_reference& operator=(I_hold_reference other){
swap(*this, other);
return *this;
}
inline I_hold_reference& operator=(I_hold_reference&& other){
swap(*this, other);
return *this;
}
private:
reference_wrapper<const int> my_reference;
};
void swap(I_hold_reference& first, I_hold_reference& second){
first = I_hold_reference(second.my_reference); //error: use of overloaded operator '=' is ambiguous (with operand types 'I_hold_reference' and 'I_hold_reference')
}
当 Copy 赋值运算符被更改为通过引用而不是按值获取其参数时,该错误已得到修复。
inline I_hold_reference& operator=(I_hold_reference& other){ ... }
为什么这可以修复错误?一种可能的含义是链接问题中引用的重要优化可能性丢失了。参考文献是这样吗?这种变化的其他影响是什么?
有一个依赖此运算符的代码库,不存在其他成员,只有提到的引用。是否需要以某种方式使代码库适应这种变化,或者它是否安全?