153得票3回答
自动生成默认/复制/移动构造函数和复制/移动赋值运算符的条件是什么?

我希望能够重新了解编译器通常在哪些情况下会自动生成默认构造函数、复制构造函数和赋值运算符。 我记得有一些规则,但是我不记得了,而且在网上也找不到可靠的资源。有人可以帮助吗?

146得票6回答
移动赋值运算符和 `if (this != &rhs)`

在一个类的赋值运算符中,通常需要检查被赋值的对象是否为调用对象,以免出现问题:Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment...

16得票2回答
使用swap实现移动赋值

我有一个想法,认为它是完全合理的,但我想听听其他人的意见,以防万一我漏掉了什么。首先,我对 T& operator=(T&& rhs) 的理解是,我们不关心 rhs 的内容,只要将其内容移动到this 中,并且 rhs 可以被安全地销毁。 话虽如此,如果交换操作很便宜...

14得票2回答
标准库中为何存在不安全的自赋值移动赋值运算符的原因是什么?

标准库关于移动赋值的策略是实现可以假设永远不会出现自我赋值; 这对我来说似乎是一个非常糟糕的想法,因为: C++中“常规”(“复制”)赋值的约定一直被认为是安全的,不会出现自我赋值的情况;现在我们又有了另一个不连贯的C++边角情况需要记住和解释——而且还是一个微妙危险的情况;我认为我们都认...

10得票2回答
通过析构函数和移动构造函数实现的移动赋值是否安全?

以下是一个非常简单的方法,用于为具有移动构造函数的大多数类定义移动赋值:class Foo { public: Foo(Foo&& foo); // you still have to write this one Foo&amp...

9得票3回答
在C++中检测到了double free,位于tcache 2中的free()。

首先,我确实检查了是否已经有类似的问题被问过,但是我没有找到任何相关的信息。错误消息不应该误导您,我的情况可能有点不同,或者我可能只是漏掉了一些东西。 当我处理一个简单的 C++ 代码时,遇到了一个奇怪的错误。程序输出说有双重释放的情况,但我无法看到发生错误的地方。代码可能有点长,请见谅。 ...

8得票2回答
将赋值运算符实现为“销毁 + 构造”是否合法?

我经常需要为“原始”资源句柄(如文件句柄、Win32操作系统句柄等)实现C++包装器。在这样做时,我还需要实现移动运算符,因为默认的编译器生成的运算符不会清除已移动的对象,导致重复删除问题。 当实现移动赋值运算符时,我更喜欢显式调用析构函数并使用放置new在原地重新创建对象。这样,我避免了析...

8得票3回答
MSVC /permissive- 下 std::string 的重载运算符 '=' 有歧义

使用 /permissive 编译成功,但使用 /permissive- 失败。哪些地方不符合规范,如何解决? 为什么在 (2) 中正常,而在 (4)(3) 中失败? 如果删除 operator long 也会正常。 如何在不更改调用站点 (3,4) 的情况下解决这个问题? #inclu...

7得票1回答
为什么在声明移动赋值运算符时,C++11或C++14编译器会隐式删除复制构造函数?

我希望创建一个包含迭代器类的列表数据结构。一切都运行良好,但当我声明移动赋值运算符时,如果使用C++14或C++11标准,程序将无法编译,但在C++17和C++2a中运行正常。 list.h: #pragma once #include <iostream> templat...