错误:使用复制和交换习惯的交换函数中的'operator ='含糊不清的重载

大卫·托斯(DavidTóth)

常量引用作为成员的类中使用复制和交换惯用法时,会发生上述错误。

示例代码:

#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')
}

当将“复制”赋值运算符更改为按引用而不是按值接受其参数时,该错误已修复。

    inline I_hold_reference& operator=(I_hold_reference& other){ ... }

为什么这可以修复错误?一种可能的含义是,链接问题中提到重要优化可能性丢失了。引用曾经是真的吗?此更改还有哪些其他含义?

有一个依赖于此运算符的代码库,没有其他成员,只有提及的引用。是否需要以某种方式使代码库适应此更改,还是按原样安全?

Sebrockm

如果您仔细地遵循链接的描述,您将看到您只能有一个重载,operator=并且需要按值接受其参数。因此,只需消除operator=(I_hold_reference&&)重载即可使您的代码可编译。

但是,这不是唯一的问题。swap不交换!相反,它分配的副本secondfirst和叶second不变。

这就是你想要的:

class I_hold_reference
{
    I_hold_reference(const int& number_reference)
     : my_reference(number_reference){}

    friend void swap(I_hold_reference& first, I_hold_reference& second)
    {
        using std::swap;
        swap(first.my_reference, second.my_reference);
    }

    I_hold_reference& operator=(I_hold_reference other)
    {
        swap(*this, other);
        return *this;
    }
private:
    reference_wrapper<const int> my_reference;
};

注意:我删除了不必要inline的,因为成员函数是隐式内联的。我也在swap类中声明了该函数。您可以在共享的链接中找到对此的解释。

同样,在此特定示例中,首先不需要使用复制和交换习惯。std::reference_wrapper不是手动维护的资源,这意味着它具有适当的内置复制和移动语义。因此,在此特定示例中,编译器生成的复制和移动运算符将具有与此处手动创建的行为完全相同的行为。因此,您应该使用这些而不是以任何方式编写自己的。另一方面,如果这只是一个玩具示例,并且实际类中更多资源需要手动管理,那么这就是要走的路。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

char *和char [N]含糊不清

来自分类Dev

效率极低且含糊不清的代码

来自分类Dev

调整图像大小时,在面部和眼睛检测中含糊不清

来自分类Dev

Java:对..的引用含糊不清,方法中的method1和method2都匹配

来自分类Dev

tesseract Remove_Reference在Visual Studio 2012中的项目中含糊不清的符号

来自分类Dev

含糊不清地使用“ ??”

来自分类Dev

测试时含糊不清的方法

来自分类Dev

IBrokers-reqMktData导致错误,显示股票代码“含糊不清”

来自分类Dev

使用类型化集合时编译错误含糊不清地引用方法

来自分类Dev

成员“下标”含糊不清

来自分类Dev

对成员“计数”的含糊不清

来自分类Dev

为什么这个电话含糊不清?

来自分类Dev

在Swift 2中含糊不清地使用“ init”和可选参数

来自分类Dev

C ++重载函数指针含糊不清

来自分类Dev

Java重载:对调用的引用含糊不清

来自分类Dev

含糊不清地使用“密钥”

来自分类Dev

系列的真值含糊不清

来自分类Dev

对模板类的含糊不清的引用(C ++)

来自分类Dev

含糊不清的警告:“部署未使用WARN [0064]映像[gcr.io/wired-benefit-XXXXX/demoapp]”

来自分类Dev

系列的真值含糊不清。使用a.empty,a.bool(),a.item(),a.any()或a.all()-not()可能存在问题

来自分类Dev

调整图像大小时,在面部和眼睛检测中含糊不清

来自分类Dev

在css中悬停时含糊不清的dop down菜单

来自分类Dev

Java库中对重载定义的含糊不清的引用

来自分类Dev

C ++重载函数指针含糊不清

来自分类Dev

含糊不清地使用“密钥”

来自分类Dev

Scala错误对重载定义的含糊不清的引用

来自分类Dev

春季简介含糊不清

来自分类Dev

Visual Studio 2015 Win 732。“ cocos2d”含糊不清,但仍可以编译和运行

来自分类Dev

Java varargs 方法重载编译器错误 - 含糊不清?

Related 相关文章

  1. 1

    char *和char [N]含糊不清

  2. 2

    效率极低且含糊不清的代码

  3. 3

    调整图像大小时,在面部和眼睛检测中含糊不清

  4. 4

    Java:对..的引用含糊不清,方法中的method1和method2都匹配

  5. 5

    tesseract Remove_Reference在Visual Studio 2012中的项目中含糊不清的符号

  6. 6

    含糊不清地使用“ ??”

  7. 7

    测试时含糊不清的方法

  8. 8

    IBrokers-reqMktData导致错误,显示股票代码“含糊不清”

  9. 9

    使用类型化集合时编译错误含糊不清地引用方法

  10. 10

    成员“下标”含糊不清

  11. 11

    对成员“计数”的含糊不清

  12. 12

    为什么这个电话含糊不清?

  13. 13

    在Swift 2中含糊不清地使用“ init”和可选参数

  14. 14

    C ++重载函数指针含糊不清

  15. 15

    Java重载:对调用的引用含糊不清

  16. 16

    含糊不清地使用“密钥”

  17. 17

    系列的真值含糊不清

  18. 18

    对模板类的含糊不清的引用(C ++)

  19. 19

    含糊不清的警告:“部署未使用WARN [0064]映像[gcr.io/wired-benefit-XXXXX/demoapp]”

  20. 20

    系列的真值含糊不清。使用a.empty,a.bool(),a.item(),a.any()或a.all()-not()可能存在问题

  21. 21

    调整图像大小时,在面部和眼睛检测中含糊不清

  22. 22

    在css中悬停时含糊不清的dop down菜单

  23. 23

    Java库中对重载定义的含糊不清的引用

  24. 24

    C ++重载函数指针含糊不清

  25. 25

    含糊不清地使用“密钥”

  26. 26

    Scala错误对重载定义的含糊不清的引用

  27. 27

    春季简介含糊不清

  28. 28

    Visual Studio 2015 Win 732。“ cocos2d”含糊不清,但仍可以编译和运行

  29. 29

    Java varargs 方法重载编译器错误 - 含糊不清?

热门标签

归档