问题标签 [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 投票
1 回答
198 浏览

c++ - C ++将分配移动到未初始化的对象?

跟进: 使用复制构造函数后双释放子对象

我按照建议遵循了 5 规则。但现在似乎移动分配发生在一个未初始化的对象(对象 id 0)上?我预计它会从对象 3 移动到对象 2。

我创建了以下(最少?)示例,这似乎触发了我的问题:

这会产生以下输出:

这是我没想到的行:

class A move assignment - from object id: 3 - to object id: 0

期待:

class A move assignment - from object id: 3 - to object id: 2

我正在使用以下编译器:Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26429.4

以防你投反对票。请说明原因。我很乐意尝试改进我的问题。

编辑:

似乎只有针对 x86 平台的 Visual C++ 编译器才会出现此问题。它适用于 g++ (x86 & x64)、clang (x86 & x64) 和 msvc (x64)。这让我更难弄清楚这个问题的根源。

0 投票
1 回答
1122 浏览

c++ - C++中移动赋值运算符的继承

我需要一些帮助来理解移动赋值运算符的继承过程。对于给定的基类

我不太确定如何在派生类中调用基本移动赋值运算符?我应该只使用范围运算符并说

其次是类std::move(...)中定义的附加项目的后续Derived,还是有其他方法?

0 投票
0 回答
23 浏览

arrays - 通过智能指针修复对象指针成员的分配

我正在学习更多关于 C++14 中智能指针的知识。

考虑以下 MWC:

在不修改 class 的默认复制构造函数和默认赋值运算符的情况下House,如何通过智能指针在赋值期间确保正确的指针行为?

第一次尝试似乎使用std::unique_ptr将是要走的路。我可以创建一个新类:

据此我不能真正将一个唯一指针复制到另一个。有道理,对吧?它有点违背了它独特的目的。即这不会编译:

但是我可以指定一个移动赋值运算符,并unique_ptr<int[]>在赋值时移动成员,从而在赋值时将指向数据的所有权转移到左侧对象:

核心问题:这有意义吗?有没有更好的方法来增强指针成员变量的赋值?

完整的 MWE

0 投票
1 回答
67 浏览

c++11 - 在 C++ 中,如何预测是否会调用移动或复制语义?

考虑到 C++ 编译器在实例化临时对象和调用返回值优化等机制方面的自由度,通过查看某些代码是否会调用移动或复制语义(或调用多少)并不总是很清楚。

几乎感觉这些原语似乎是为了附带优化而存在的。也就是说,您可能会或可能不会得到它们。当很难控制招式本身的调用时,似乎很难设计任何一种利用招式的资源管理策略。

有没有办法清楚地(简单地)预测某些代码中可能出现的位置和数量?理想情况下,不需要成为编译器内部专家就可以做到这一点。

0 投票
2 回答
571 浏览

c++ - C++ 中的移动赋值问题。非法指令:4

我正在编写一个简单的 Matrix 类,除其他外,我还定义了一个 operator+ 重载和一个移动赋值。当他们两个互动时,似乎发生了一些事情,但我找不到我错在哪里。这是我的代码(我删除了所有多余的内容,只留下了显示错误所需的内容)。有问题的行在最后,主要是:

当调用移动分配以将 m0+m0 的结果移动到 m1 时,它给了我错误。

如果我在 Mac 上使用 g++ 编译我的代码,给出的错误只是“非法指令:4”,仅此而已。如果我在 Linux 上执行此操作,则给出的错误是:

在成员函数'Matrix Matrix::operator+(const Matrix&)'中:p.cpp:90:16:错误:使用已删除的函数'constexpr Matrix::Matrix(const Matrix&)' return new_m; ^~~~~ p.cpp:9:7: 注意:'constexpr Matrix::Matrix(const Matrix&)' 被隐式声明为已删除,因为'Matrix' 声明了一个移动构造函数或移动赋值运算符类 Matrix{ ^~~~ ~~

先感谢您!

0 投票
1 回答
35 浏览

c++11 - 注释掉`move constructor`和`move assignment operator`会导致编译错误

我从每个 C++ 开发人员应该使用的十个 C++11 特性中获取了以下代码。我想查看带有 / 不带有move constructorand的输出move assignment operator。原始代码编译良好。但是,如果我注释掉这两种方法的实现,则编译失败并出现错误:

编译器:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)

这是代码:

0 投票
1 回答
958 浏览

c++ - 在为类实现移动赋值运算符时真的需要自赋值检查吗?

//因为它将在 r-value 上调用,所以为什么要自赋值?

0 投票
2 回答
112 浏览

c++ - 为类重载“*”运算符以返回类变量

我有两个 cpp 文件和一个 hpp 文件。Main.cpp、Ab.cpp 和 Ab.hpp。

在这些文件中,我创建了一个类“Ab”,它有一个默认构造函数和一个接受字符串的构造函数。在类中,我想重新定义 * 运算符以将给定值设置为类的对象,并删除之前分配给它的任何值。

值得一提的是,我被指示在此任务中不允许使用任何复制构造函数或复制分配。这意味着我必须求助于使用纯粹的移动构造函数和移动赋值。在这些科目中,我的知识非常有限,因为我以前只使用过基本的 C#。

Main.cpp 如下:

Ab.cpp 如下:

Ab.hpp 如下

我目前收到错误:

没有运算符“*”与这些操作数匹配——操作数类型为:* AB

0 投票
1 回答
86 浏览

c++ - 为什么 gcc 6.4.0 c++14 会自动将左值移动到右值

我遇到了 gcc 编译器将局部变量(不是临时的)作为右值参数移动到函数的问题。我有一个简单的例子:

输出:

我没想到它,因为移动赋值将右值归零。在我的情况下,它导致崩溃,因为在 b1=b2; 之后使用了 b2;

问题是为什么会发生。

0 投票
2 回答
1442 浏览

c++11 - 新的现代 C++ 容器中的分配器传播策略

在容器中具有这些特征的原因是什么(https://en.cppreference.com/w/cpp/memory/allocator_traits

我了解容器实现在分配和交换的实现中将以一种或另一种方式表现。(并且处理这些情况是可怕的代码。)我也明白,有时可能需要将移动容器留在一个状态,resizeble或者至少可以调用一些最后的释放,所以分配器不能无效。(我个人认为这是一个弱论点。)

但问题是,为什么这些信息不能成为自定义分配器类型本身的正常实现和语义的一部分?

我的意思是,容器复制分配可以尝试复制分配源分配器,如果该语法复制分配没有真正复制,那么,就像说你的容器没有 propagate_on_container_copy_assignment

以同样的方式,而不是使用is_always_equalone 实际上可以使分配器分配什么也不做。

(此外,如果is_always_equal是真的,可以让operator==分配器返回std::true_type信号。)

在我看来,这些特征似乎试图覆盖人们可以通过普通 C++ 手段赋予自定义分配器的语义。这似乎与泛型编程和当前的 C++ 哲学背道而驰。

唯一的原因,我认为这对于实现与“旧”容器的某种向后兼容性很有用。

如果我今天要编写一个容器和/或一个的非平凡分配器,我可以依赖分配器的语义而忘记这些特征吗?

在我看来,只要移动的分配器可以“解除分配”一个空指针状态(这意味着在这种特殊情况下基本上什么都不做),那么它应该没问题,如果resize抛出,那也没问题(有效) ,它只是意味着分配器不再有权访问它的堆。


编辑:实际上, 我可以这样简单地编写容器吗?并将复杂性委托给自定义分配器的语义?:

我认为对分配器的唯一真正要求是,从分配器移出的分配器应该能够做到这一点。

并且,如果移出容器由于移出分配器失去对堆的访问权而无法调整大小(例如,因为没有特定资源的默认分配器),那么,太糟糕了,那么操作将抛出(因为任何调整大小可以扔)。