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

c++ - 移动分配会破坏引用吗?

我不明白移动赋值是否能够/自由更改变量 x 的地址并使所有存储 &x 的指针和引用无效。我认为这是错误的,因为默认的移动分配会移动每个成员并保留 this 指针,但可以保证吗?

编辑:示例

0 投票
1 回答
565 浏览

c++ - 如何删除移动赋值运算符并保​​持与标准容器的兼容性?

我有一个简单的 RAII 包装器来管理某个资源。这是界面:

std这里的问题是,一旦我明确删除移动赋值运算符,我就不能再将这个类与容器和算法一起使用。显然我确实需要删除或正确实施它,因为我刚刚学会了艰难的方式。

另一种选择是通过常规赋值运算符实现移动赋值,但我不确定如何正确执行此操作。我想我需要类似的东西std::remove_reference?我想知道它是否会过多地删除一个引用并导致创建不必要的临时对象。

0 投票
1 回答
1113 浏览

c++11 - Move assignment operator, move constructor

I've been trying to nail down the rule of 5, but most of the information online is vastly over-complicated, and the example codes differ.

Even my textbook doesn't cover this topic very well.

On move semantics:

Templates, rvalues and lvalues aside, as I understand it, move semantics are simply this:

As apposed to copying, which would be the equivalent of something like this:

No explanation of rvalues, lvalues or templates is necessary, I would go as far as to say those topics are unrelated.

The fact that the first example is faster than the second, should be a given. And I would also point out that any efficient code prior to C++ 11 will do this.

To my understanding, the idea was to bundle all of this behavior in a neat little operator move() in std library.

When writing copy constructors and copy assignment operators, I simply do this:

The equivalent, one would think, would be this:

I'm quite certain this won't work, so my question is: How do you achieve this type of constructor functionality with move semantics?

0 投票
3 回答
807 浏览

c++ - 如何确保使用移动构造函数

下面的代码给出了错误:

现在,我知道发生这种情况是因为通过指定移动构造函数(有意)隐式删除了复制构造函数,并且复制向量会导致调用(已删除)复制构造函数。我想我也明白为什么要使用向量的复制构造函数和赋值运算符了。我显然想使用移动构造函数和赋值运算符:移动对象,所以也要移动它包含的向量。那么,如何让我的移动构造函数/赋值运算符使用向量的移动构造函数/赋值运算符?

这是代码:

0 投票
1 回答
97 浏览

c++ - 临时左值是 std::move 的用例吗

我有一个class这样的:

我可以这样使用:

如果我得出不再需要的结论a,我可以致电:


但是现在如果我A只需要一个对象来构建widget呢?我会这样做吗:

或者

0 投票
1 回答
161 浏览

c++ - 当赋值运算符显式删除时允许从右值赋值?

考虑以下代码,它在 Clang、GCC 和 VS 2015 下编译(在线示例):

我不清楚为什么这条线

编译,执行移动构造函数而不是移动赋值运算符。

我知道 RVO 允许省略构造和赋值作为优化,但我的理解是,如果在代码中显式使用该运算符,则显式删除运算符会导致编译失败。

C++11 规范中是否有某些条款允许编译器将赋值初始化转换为复制构造,即使已显式删除类型的赋值运算符?

0 投票
1 回答
185 浏览

c++11 - 何时在 C++11 中调用移动构造函数?

我无法理解为什么移动构造函数没有被调用,而移动赋值能够,而如果我在 X 行中使用移动函数,它曾经调用移动构造函数。谁能告诉调用移动构造函数的方式或语法是什么。

输出:

Raw Copy Something Something Raw Nothing 默认复制 Move 赋值 析构函数 析构函数 析构函数 析构函数 析构函数

0 投票
2 回答
2013 浏览

c++ - 同一对象上的双重移动是从左到右复制?

我只是c ++ 11移动操作的初学者,所以玩它。但是发现了一些我无法理解的东西。

我期望该b = std::move(a)操作会表现出不同的行为,因为我第二次在对象上应用移动,但它将左侧对象b复制右侧对象a,这部分我不明白。

或者我在编程中做错了什么。如果我在移动操作中做错了什么,请帮忙。

编辑:我知道这是未定义的行为。我的疑问是我是否会再做一次,那么它是从对象a复制到对象b,如果我再次做同样的事情,那么会将对象b复制到对象a吗?

因此它是从左到右和从右到左复制表格,为什么?

0 投票
3 回答
2765 浏览

c++ - 编译器不会使用复制分配而不是移动?

我有一个类,其中移动分配被显式删除,因为该对象不应该是可移动的。但是如果我使用 RVO 分配给这个类的一个实例,编译器会给我错误:

编译器也提到了现有的复制赋值运算符,但没有使用它。

这是我的代码(或此处的(未)运行示例

我在这里找到了一个非常相似的帖子。

我知道我可以通过使用临时来避免这种情况。我想知道为什么每个编译器(我用 gcc、clang 和 vs2013 测试过)都不能直接调用现有的复制分配?有什么我想念的吗?

0 投票
1 回答
1042 浏览

c++ - 具有动态内存的类的 C++ 规则五

所以我正在为一个具有动态 int 数组的类编写大五

到目前为止我得到了什么:

显然有问题,但我对五巨头不是很熟悉......我搜索了很多但仍然没有找到答案......