PSL*_*PSL 8 c++ move-semantics
在下面的代码中,为什么第一次调用mkme = mvme_rv调度不到T& operator=(const T&&)?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using T = vector<int>;
int main()
{
T mvme(10, 1), mkme;
T&& mvme_rv = move(mvme); // rvalue ref?
mkme = mvme_rv; // calls T& operator=(const T&)?
cout << mvme.empty(); // 0
mkme = move(mvme_rv); // calls T& operator=(const T&&)?
cout << mvme.empty(); // 1
}
Run Code Online (Sandbox Code Playgroud)
Ric*_*ges 11
正如skypjack正确评论一样,通过名称访问对象总会产生左值引用.
这是一个安全功能,如果你仔细考虑,你就会意识到你很高兴.
如您所知,std::move只需将l值引用转换为r值引用.如果我们立即使用返回的r值引用(即未命名),那么它仍然是r值引用.
这意味着r值的使用只能在代码所在的move(x)位置.从代码阅读器的角度来看,现在很容易看出x的状态未定义.
所以:
1: auto x = make_x();
2: auto&& r = std::move(x);
3: // lots of other stuff
35: // ...
54: // ...
55: take_my_x(r);
Run Code Online (Sandbox Code Playgroud)
不起作用.如果确实如此,维护代码的人将很难看到(并记住)x(在第1行定义)通过第2行的引用进入第55行的未定义状态.
这是一个更明确的好事:
1: auto x = make_x();
2: //
3: // lots of other stuff
35: // ...
54: // ...
55: take_my_x(std::move(x));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |