问题标签 [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.
c++ - 为什么 GCC 在复制赋值操作中拒绝 const 引用?
我想正常重载一个常见的复制赋值运算符。一开始我使用了一个只需要对源进行 const 引用的接口,并显式禁用了接受可修改引用的接口,但我无法通过编译。编译器报告“错误:使用已删除的函数 'ClassA& ClassA::operator=(ClassA&)”
当然,如果我不明确删除接口,我可以编译,但这不是我的目的。我想明确删除它,以避免意外使用它。
为什么复制赋值操作需要对源的可修改引用,而不是 const 引用?赋值操作只需要以只读方式访问源!
关于复制构造函数也有同样的问题,为了简化我省略了它。
我的代码有什么问题?或者我们不能删除它?
我的示例代码如下:
c++ - 创建一个移动分配函数,不断得到“指针被释放没有分配”
我正在尝试创建一个移动分配函数,但我不断收到“未分配指针被释放”
a.out(37068,0x1000b45c0) malloc: * 对象 0x1001025a0 的错误:未分配被释放的指针 a.out(37068,0x1000b45c0) malloc: *在 malloc_error_break 中设置断点以进行调试
c++ - 作者所说的“让对象处于可分配状态”是什么意思?
以下是Thomas Becker 先生在本文结尾处的一个片段:
作者上面所说的“让对象处于可分配状态”是什么意思?
c++ - msvc /permissive-std::string 重载运算符 '=' 不明确
它编译/permissive
但失败了/permissive-
。什么不符合以及如何解决?
为什么它很好(2)
但失败了?如果我删除它也很好。(4)
(3)
operator long
如何在不更改呼叫站点的情况下修复它(3,4)
?
错误信息
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{}));”时,输出变为
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 和自分配检查的需要。然后我提出的新实现变为:
c++ - C++按值赋值,有什么缺点?
最近,我偶然发现了这种模式:
仔细观察这个模式会发现,由于复制省略,这个单一的分配功能可以免费提供移动分配和“复制和交换”的复制分配。既然这么好用,又何尝不是“主流模式”呢。有没有这样做的?
注意:没有临时对象的自定义复制构造函数可以在更少的步骤中产生操作,但是,对于这个问题,明确编写复制和移动分配周围的交换可以带来什么好处。
关于可能重复的问题“什么是复制和交换习语”,我的问题假设读者已经知道它是什么。
谢谢
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)”时
我的移动赋值运算符是错误的,还是我以错误的方式使用它?
c++ - 奇怪的移动赋值运算符签名
我在 Pytorch 的张量后端(ATen, source)中遇到了一个不熟悉的移动赋值运算符签名。只是出于好奇,&&
操作员在结束时会做什么
虽然我熟悉移动语义以及通常的复制/移动构造函数和赋值运算符签名,但我无法在网上找到有关上述语法的任何文档。
如果有人能解释这个运算符的作用,它与通常的移动赋值操作有何不同,以及何时应该使用它,我将不胜感激。
c++ - 初始化对象和赋值给对象的区别
我正在做一些基本的对象练习,我遇到了这个问题。
此类名为 Matrix,我尝试将其初始化a7
为a2.mutiply(a5)
.
但是当我一开始尝试初始化并稍后a7
分配它时,结果却大不相同。a2.mutiply(a5)
我以为这两个代码是一样的,但结果告诉我我错了。
有人可以帮我指出问题吗?
矩阵.h
源.cpp
结果.txt