meg*_*uli 1 c++ swap move-semantics c++17
我有一个非常简单的示例类,使用C ++ 17编译。
#include <string>
#include <iostream>
struct name {
std::string first, middle, last;
name() = default;
name(name const&) = default;
name(name &&) = default;
name& operator=(name o) {
std::swap(*this, o); // bad!
return *this;
}
};
int main() {
name n1{"mr", "john", "smith"};
name n2 = std::move(n1);
name n3 = n2;
std::cout << n3.first << " " << n3.middle << " " << n3.last;
}
Run Code Online (Sandbox Code Playgroud)
使用这种价值语义,将移动分配捆绑在一起,我故意将其称为合格交换,而不是using std::swap; swap(*this, o);。无论如何,我没有提供交换。考虑到STL将交换实现为移动构造和一系列移动分配,因此我认为此实现将无限递归,交换调用move和移动调用swap。被std::swap改变成成员明智的掉期或类似的东西?
你从未调用过operator=; 您所有的代码都使用初始化(调用构造函数),特别是复制初始化,而不是赋值(调用operator=)。
将代码更改为:
name n1{"mr", "john", "smith"};
name n2, n3;
n2 = std::move(n1);
n3 = n2;
Run Code Online (Sandbox Code Playgroud)
然后您会看到operator=用过的(大概会爆炸)。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |