我今天在人们的答案中看到过这几个地方,比如我有Foo的构造函数.
Foo( std::vector<SomeType>&& data) noexcept : data_(std::move(data)) {};
Run Code Online (Sandbox Code Playgroud)
为什么std :: move(data)是必需的,因为数据类型不是std :: vector <SomeType> &&?
std :: move对我来说,它只是简单地将数据转换为std :: vector <SomeType> &&?
http://en.cppreference.com/w/cpp/utility/move 将std :: move定义为,
static_cast<typename std::remove_reference<T>::type&&>(t)
Run Code Online (Sandbox Code Playgroud)
所以似乎std :: move在这种情况下再次无关紧要,但我可能错过了一些东西.
在这两种情况下,
void foo(const T& bar); // 1
void foo(T&& bar); // 2
Run Code Online (Sandbox Code Playgroud)
bar实际上是一个lvalue.&&重载2将绑定到右值的意思是什么,例如在以下情况下:
foo(Bar());
Run Code Online (Sandbox Code Playgroud)
而重载1会在这里绑定:
T bar;
foo(bar);
Run Code Online (Sandbox Code Playgroud)
在2,您仍然需要使用std::move来使bar外观和行为像rvalue函数内部.
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |