问题标签 [move-assignment-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
119 浏览

c++ - 为什么 GCC 在复制赋值操作中拒绝 const 引用?

我想正常重载一个常见的复制赋值运算符。一开始我使用了一个只需要对源进行 const 引用的接口,并显式禁用了接受可修改引用的接口,但我无法通过编译。编译器报告“错误:使用已删除的函数 'ClassA& ClassA::operator=(ClassA&)”

当然,如果我不明确删除接口,我可以编译,但这不是我的目的。我想明确删除它,以避免意外使用它。

为什么复制赋值操作需要对源的可修改引用,而不是 const 引用?赋值操作只需要以只读方式访问源!

关于复制构造函数也有同样的问题,为了简化我省略了它。

我的代码有什么问题?或者我们不能删除它?

我的示例代码如下:

0 投票
2 回答
107 浏览

c++ - 创建一个移动分配函数,不断得到“指针被释放没有分配”

我正在尝试创建一个移动分配函数,但我不断收到“未分配指针被释放”

a.out(37068,0x1000b45c0) malloc: * 对象 0x1001025a0 的错误:未分配被释放的指针 a.out(37068,0x1000b45c0) malloc: *在 malloc_error_break 中设置断点以进行调试

0 投票
0 回答
34 浏览

c++ - 作者所说的“让对象处于可分配状态”是什么意思?

以下是Thomas Becker 先生在本文结尾处的一个片段:

作者上面所说的“让对象处于可分配状态”是什么意思?

0 投票
3 回答
250 浏览

c++ - msvc /permissive-std::string 重载运算符 '=' 不明确

它编译/permissive但失败了/permissive-。什么不符合以及如何解决?

为什么它很好(2)但失败了?如果我删除它也很好。(4)(3)operator long

如何在不更改呼叫站点的情况下修复它(3,4)

错误信息

0 投票
3 回答
21723 浏览

c++ - free():在 C++ 的 tcache 2 中检测到双重释放

首先,我真的检查了是否有问题已经被问过,但我找不到任何问题。错误消息不应该欺骗你我猜我的情况有点不同,或者我只是错过了一些东西。

当我处理一个玩具 C++ 代码时,我遇到了一个奇怪的错误。程序输出说有双重释放的情况,但我看不到这个错误发生的地方。代码可能有点长,对此我深表歉意。

我现在正在工作Linux Distribution,我正在使用g++ 9.1.0. 我检查了我的代码并寻找错误的部分。

即使我修复了部分代码,但我的问题并没有得到解决,除非我评论或者Foo{1, "Hello World"};vec.push_back(std::move(Foo{}));不明白为什么。

如果我不在函数 main 中的任何地方注释,输出如下。

如果我评论 "Foo{1, "Hello World"};",输出变为

最后,当我评论“vec.push_back(std::move(Foo{}));”时,输出变为

0 投票
2 回答
530 浏览

c++ - 将赋值运算符实现为“销毁+构造”是否合法?

我经常需要为“原始”资源句柄(如文件句柄、Win32 OS 句柄等)实现 C++ 包装器。这样做时,我还需要实现移动运算符,因为默认的编译器生成的不会清除移动的对象,从而产生双重删除问题。

在实现移动赋值运算符时,我更喜欢显式调用析构函数并使用placement new 就地重新创建对象。这样,我就避免了重复析构逻辑。此外,我经常以复制+移动(相关时)的方式实现复制分配。这导致以下代码:

这让我觉得很奇怪,但我没有在网上看到任何关于以这种“规范”方式实现移动+复制分配运算符的建议。相反,大多数网站倾向于以特定类型的方式实现赋值运算符,在维护类时必须手动与构造函数和析构函数保持同步。

是否有反对以这种与类型无关的“规范”方式实现移动和复制赋值运算符的论点(除了性能)?

更新 2019-10-08 基于 UB 评论:

我已经阅读了http://eel.is/c++draft/basic.life#8似乎涵盖了相关案例。提炼:

如果,在对象的生命周期结束后......,在原始对象占用的存储位置创建一个新对象,一个指向原始对象的指针,一个指向原始对象的引用,......将自动引用新对象,并且,...,可用于操作新对象,如果...

此后有一些明显的条件与相同的类型和 const/reference 成员相关,但它们似乎是任何赋值运算符实现所必需的。如果我错了,请纠正我,但这在我看来就像我的“规范”样本表现良好而不是UB(?)

基于复制和交换评论的更新 2019-10-10:

赋值实现可以合并到一个方法中,该方法采用值参数而不是引用。这似乎也消除了对 static_assert 和自分配检查的需要。然后我提出的新实现变为:

0 投票
0 回答
62 浏览

c++ - C++按值赋值,有什么缺点?

最近,我偶然发现了这种模式:

仔细观察这个模式会发现,由于复制省略,这个单一的分配功能可以免费提供移动分配和“复制和交换”的复制分配。既然这么好用,又何尝不是“主流模式”呢。有没有这样做的?

注意:没有临时对象的自定义复制构造函数可以在更少的步骤中产生操作,但是,对于这个问题,明确编写复制和移动分配周围的交换可以带来什么好处。

关于可能重复的问题“什么是复制和交换习语”,我的问题假设读者已经知道它是什么。

谢谢

0 投票
1 回答
150 浏览

c++ - 移动构造函数与移动赋值

作为这个问题的延伸,我试图让我的移动分配正确。

我有以下代码:

但是当我尝试使用它时,我的代码无法编译。

首先是一些代码:

我收到以下错误:

main.cpp(24): 错误 C2593: 'operator =' 不明确

linkedlist.h(79):注意:可能是 'LinkedList &LinkedList::operator =(LinkedList &&) noexcept'(指向移动赋值运算符)

linkedlist.h(63): note: or 'LinkedList &LinkedList::operator =(LinkedList) noexcept' (指向复制赋值运算符)

main.cpp(24):注意:在尝试匹配参数列表“(LinkedList,LinkedList)”时

我的移动赋值运算符是错误的,还是我以错误的方式使用它?

0 投票
1 回答
79 浏览

c++ - 奇怪的移动赋值运算符签名

我在 Pytorch 的张量后端(ATen, source)中遇到了一个不熟悉的移动赋值运算符签名。只是出于好奇,&&操作员在结束时会做什么

虽然我熟悉移动语义以及通常的复制/移动构造函数和赋值运算符签名,但我无法在网上找到有关上述语法的任何文档。

如果有人能解释这个运算符的作用,它与通常的移动赋值操作有何不同,以及何时应该使用它,我将不胜感激。

0 投票
1 回答
50 浏览

c++ - 初始化对象和赋值给对象的区别

我正在做一些基本的对象练习,我遇到了这个问题。

此类名为 Matrix,我尝试将其初始化a7a2.mutiply(a5).

但是当我一开始尝试初始化并稍后a7分配它时,结果却大不相同。a2.mutiply(a5)

我以为这两个代码是一样的,但结果告诉我我错了。

有人可以帮我指出问题吗?

矩阵.h

源.cpp

结果.txt