问题标签 [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 回答
76 浏览

c++ - 在 .cc 源文件中设置为默认值时,移动构造函数和移动赋值运算符抛出错误

我有一个看起来大致像这样的模板基类

矢量.cc:

矢量.h

当我编译这个我得到错误error: array used as initializererror: invalid array assignment警告note: synthesized method [...] first required here

当我将其= default;放入.h文件中的声明时,我没有收到任何错误或警告。

我已经阅读了多个来源,我可以将其= default;放入定义中,但对我来说它不起作用。

我究竟做错了什么?我错过了什么吗?还是我只是依赖错误的来源?

0 投票
1 回答
57 浏览

c++ - 通过构造函数方法输出的类到类类型转换是5500 为什么不是5555

输出是 5500,但为什么不是 5555?

这里调用项目类的构造函数,并通过它传递产品对象。

0 投票
1 回答
93 浏览

c++ - C++:关于使用 Stroustrup 示例的移动构造函数/赋值的问题

我了解右值如何调用移动构造函数和移动赋值运算符,但是我很困惑为什么下面 Stroustrup 的移动赋值示例中的相同代码不用于移动构造函数。这是来自 C++ 第 4 版。第 379 页修改了勘误表。

由于类中的所有对象都在移动构造函数中复制,为什么移动构造函数不能像移动赋值运算符那样简单地交换对象的指针?

也许我错过了一些东西,感谢您的指导!

0 投票
1 回答
282 浏览

c++ - 为什么在 C++11 或 C++14 中,当我声明移动赋值运算符时,编译器会隐式删除复制构造函数?

我想创建一个包含迭代器类的列表数据结构。一切正常,但是当我声明移动赋值运算符时,如果程序使用 C++14 或 C++11 标准,则程序无法编译,但在 C++17、C++2a 中运行良好。

列表.h:

主.cpp:

这是一个精简版,但足以描述问题。

编译器错误和注释消息:

0 投票
1 回答
102 浏览

c++ - std::is_move_assignable_v false 虽然有一个移动赋值运算符

上下文:我有一个DLXMatrix具有某些属性的类,这些属性是某个名为Header. 每个都Header持有一些指向Header同一向量元素的其他指针(想想一个既是向量又是双向链表的结构)。因此,我不能使用默认的复制构造函数和赋值运算符,因为它们会指向原始元素而不是副本。注意:我确保向量永远不会在内存中调整大小或移动。

如果我没记错的话,虽然我定义了自定义复制和赋值运算符,但默认析构函数、移动构造函数和移动赋值副本应该可以按预期工作而不会泄漏。现在,我想使用std::swap但它拒绝编译,因为我的类不可移动:

所以我的问题是:

  • 这是一种合理的做事方式吗?
  • 为什么DLXMatrix不能移动分配?

如果重要的话,我将使用 g++ 7.5.0 和 clang++ 6.0.0 和标准 c++17 进行编译。

0 投票
0 回答
34 浏览

c++ - 请解释以下赋值语句的输出

我有以下代码片段。

我想了解以下赋值语句的输出。

我为此得到的输出如下。
-------------------------------------------------- --------------------------
A 类对象的复制构造:0x010FFB5C,使用 0x010FFCD4 调用
A 类对象的移动构造:0x010FFBC4,使用 0x010FFB5C 调用
析构函数类A 对象:0x010FFB5C
称为 0x010FFBC4 的普通赋值运算符函数,使用 0x010FFCD4 调用
A 类的复制构造 对象:0x010FFBB4,使用 0x010FFBC4 调用
移动赋值运算符函数,调用 0x010FFCC4,使用 0x010FFBB4 调用
普通赋值运算符函数称为 0x010FFCE4,使用 0x010FFCC4 调用
A 类对象的复制构造:0x010FFBA4,用 0x010FFCE4 调用
移动赋值运算符函数调用 0x010FFCF4,调用 0x010FFBA4
---------------------------------------- ------------------------------------
对象 a1 的
地址 - 0x010FFCF4 对象 a2 的地址 - 0x010FFCE4
的地址对象 a3 - 0x010FFCD4
对象 a4 的地址 - 0x010FFCC4

有人可以解释这段代码片段中赋值语句的输出吗?请耐心等待,因为我是移动和右值参考概念的新手。

0 投票
0 回答
30 浏览

c++11 - 什么样的引用应该在 C++ 中使用具有移动语义的 move() 成员函数?

在实现 C++11move()方法以避免复制之前。move()在 C++11 中引入了 move 语义,但有时拥有方法并从 move-constructor 和 move 调用它更容易operator=。该move()方法可以通过普通引用(l-reference)或r-reference来获取对象。

我们应该使用什么参考?哪个选项更好/更清洁/更快/...?

这是具有两种可能性的示例代码(需要 C++20):

0 投票
0 回答
158 浏览

c++ - 无法分配具有已删除复制构造函数的引用?

我的情况是,我需要为一个类实现移动构造函数和移动分配运算符,该类包含对具有已删除复制函数和复制分配运算符的对象的引用,基本上如下所示:

现在,问题是, 的分配mThing = other.mThing;正在发出错误:

提出了两个问题;

  1. 我们如何处理这个问题?实现Move Constructor,然后用它来实现Move-Assignment Operator?
  2. 我没有意识到在重新分配现有引用时编译器会在这种情况下生成一个副本。谁能解释一下?
0 投票
2 回答
135 浏览

c++ - 如果一个类只有一个(模板化的)移动赋值运算符,为什么可以进行复制赋值?

我今天偶然发现了我不明白的代码。请考虑以下示例:

编译时,MinGW-w64/g++ 10.2 声明:

我完全理解错误信息。但我不明白为什么我没有得到与 class 相同的信息A。模板化的移动赋值运算符不也是移动赋值运算符吗?那么为什么没有删除复制赋值运算符呢?这是写得很好的代码吗?

0 投票
0 回答
59 浏览

c++ - 如何为动态数组或 uni_ptr 编写移动构造函数和移动赋值运算符?

我在课堂上有一个动态数组。我有两个问题:

  1. 我想知道如何为动态数组编写移动构造函数和移动赋值运算符Tile* mytiles
  2. 数组如何写为智能指针uni_ptr?这是代码:

Tile是一个枚举:

感谢您的时间和帮助。