【发布时间】:2016-03-09 09:32:37
【问题描述】:
在这种情况下
struct Foo {};
Foo meh() {
return std::move(Foo());
}
我很确定移动是不必要的,因为新创建的 Foo 将是一个 xvalue。
但是在这种情况下呢?
struct Foo {};
Foo meh() {
Foo foo;
//do something, but knowing that foo can safely be disposed of
//but does the compiler necessarily know it?
//we may have references/pointers to foo. how could the compiler know?
return std::move(foo); //so here the move is needed, right?
}
我想需要采取行动吗?
【问题讨论】:
-
使用 Visual Studio 时。
-
在第二种情况下仅供参考,当您从函数返回时,您不能有任何可用的 foo 引用/指针。
-
你对返回的值做了什么?
Foo f = meh();已在 C++98 中使用 (N)RVO。 -
我想知道显式调用 std::move 是否会阻止 NRVO...
-
std::move是一个身份操作。它实际上从不做任何事情。它只是右值的标记。如果编译器手头有Foo的移动构造函数,它可以查看它是否具有可观察的效果并做出决定。如果它没有可观察到的影响,你怎么能分辨出来?
标签: c++ c++11 move-semantics