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

c++ - 自动生成默认/复制/移动 ctor 和复制/移动赋值运算符的条件?

我想在编译器通常自动生成默认构造函数、复制构造函数和赋值运算符的条件下刷新我的记忆。

我记得有一些规则,但我不记得了,也找不到网上有信誉的资源。任何人都可以帮忙吗?

0 投票
6 回答
47235 浏览

c++ - 移动赋值运算符和 `if (this != &rhs)`

在类的赋值运算符中,您通常需要检查被分配的对象是否是调用对象,这样您就不会搞砸了:

移动赋值运算符是否需要相同的东西?有没有一种情况this == &rhs会是真的?

0 投票
3 回答
502 浏览

c++ - 通过在移动赋值运算符中使用 std::swap 重用析构函数逻辑是否有意义?

考虑以下:

我的想法是析构函数很快就会在“其他”上运行,因此我不必使用交换在移动赋值运算符中再次实现我的析构函数逻辑。但我不确定这是一个合理的假设。这会“好”吗?

0 投票
3 回答
1758 浏览

c++ - 关于移动赋值运算符的问题

想象一下管理资源的以下类(我的问题只是关于移动赋值运算符):

问题:

上面的两个移动赋值运算符#1 和#2 的优缺点是什么?我相信我能看到的唯一区别是std::swap保留了 lhs 的存储,但是,我看不出这将如何有用,因为无论如何右值都会被破坏。也许唯一的时间是使用类似的东西a1 = std::move(a2);,但即使在这种情况下,我也看不出有任何理由使用 #1。

0 投票
2 回答
714 浏览

c++ - Is move assignment via destruct+move construct safe?

Here's a very easy way to define move assignment for most any class with a move constructor:

Is this sequence of calling your own destructor followed by placement new on the this pointer safe in standard C++11?

0 投票
1 回答
224 浏览

c++ - What ctor/assignment operator should a vector class have?

I'm writing my own vector class (a container for x, y values) and I'm not really sure what constructors/assignment operators I should implement on my own and what I can count on the compiler to provide. Obviously, I need to write any method that doesn't have the default behaviour or isn't auto-generated in any case. But sure enough, there's also no point in implementing something if the compiler can generate the exactly same thing.

I'm using Visual Studio 2010 (which might matter in the aspect of C++11). Also my class is a template one, if that matters.

Currently, I have:

Do I need copy ctor/assignment operator when I have a move ctor/move operator?

0 投票
1 回答
508 浏览

c++ - Std::stringstream 移动分配在 gcc 中不起作用

像下面这样的作业

在 gcc 中编译时确实给了我一个错误:

现在,我知道流显然无法复制,并且复制构造函数std::stringstream被标记为已删除。但是,据我了解,上述应该是移动赋值,而不是复制赋值,因为赋值运算符右侧有一个 r 值。

在这种情况下,它可能可以通过使用strstr.str(someString)来解决,但我仍然会对导致此编译器错误的原因感兴趣。顺便说一句,它在 VC++ 中编译没有问题。

0 投票
1 回答
4306 浏览

c++ - 使用swap实现移动赋值

我发生了一些事情,我认为这是完全合理的,但我希望人们对此发表意见,以防我完全错过了一些东西。所以首先,我的理解T& operator=(T&& rhs)是,当我们完成时,我们并不关心内容rhs是什么,只是内容已经被移入this并且rhs可以安全地破坏。

话虽如此,复制赋值运算符的常见异常安全实现,假设交换很便宜,看起来像这样:

所以实现移动赋值运算符的一种自然方式是这样的:

但后来我突然想到,rhs不一定是空的!那么,为什么不做一个 plainswap呢?

认为这满足了移动分配操作员需要做的事情......但就像我说的,这只是发生在我身上,所以我认为我可能遗漏了一些东西。

我能想到的唯一“缺点”是,this与执行移动构造/交换的版本相比,使用普通交换拥有的东西可能会活得更长。

想法?

0 投票
2 回答
2820 浏览

c++ - 我可以在移动赋值运算符中调用析构函数吗?

在移动赋值运算符中调用 d-tor 是一种好习惯吗?

这里有一些示例代码:

我应该使用这段代码,还是应该将 swap() 与移动构造的对象一起使用?

0 投票
2 回答
215 浏览

c++ - 为什么定义析构函数会删除隐式定义的移动赋值运算符?

C++ 标准委员会选择在定义自定义析构函数时删除隐式定义的移动赋值运算符的基本原理是什么?