- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的编译器是最新的 VC++ 2013 预览版。
#include <utility>
struct BigObject { ... };
void f(BigObject&&){}
void f(BigObject&) {}
void f(BigObject) {}
int main()
{
BigObject big_obj;
BigObject& r1 = big_obj; // OK.
BigObject&& r2 = big_obj; // error C2440
BigObject&& r3 = std::move(big_obj); // OK.
BigObject&& r4 = r3; // error C2440
f(r3); // error C2668: 'f' : ambiguous call to overloaded function
}
我们何时、何地以及为什么要使用 BigObject&& rv = std::move(big_obj);
?
最佳答案
我们何时、何地以及为什么要使用 BigObject&& rv = std::move(big_obj);
?
简答:从不,无处,原因如下:
所有命名变量表达式都是左值。所以它所做的是采用 big_obj
,这是一个左值,将其强制转换为一个 xvalue,并使用它来初始化一个右值引用,该引用随后只能用作左值,然后我们回来了到我们开始的地方。这是一行完全无用的代码。
除了函数参数,定义局部右值引用通常不是很有用。不过,它们确实延长了用于初始化它们的临时对象的生命周期,因此它们可能会偶尔用于跨多个语句分隔复杂表达式。
值类别是表达式的属性,而不是引用的属性。您可以根据希望它能够绑定(bind)到的表达式的值类别来选择要使用的引用类型。并且您使用 std::move
强制调用某个函数的特定重载,否则它会调用错误的函数或产生歧义。
Bjarne 在 GoingNative2013 的问答环节中给出的建议基本上是,不要尝试将右值引用用于比移动构造函数和移动赋值运算符更“聪明”的东西。
来自 Herb Sutter:很多人认为移动意味着到处写 &&
,但事实并非如此。您不需要自己编写 &&
,除非您正在编写移动构造函数或移动赋值运算符,或者完美地转发函数模板中的参数。
关于c++ - 我们应该在何时、何地以及为什么使用 "BigObject&& rv = std::move(big_obj);"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18760668/
我的编译器是最新的 VC++ 2013 预览版。 #include struct BigObject { ... }; void f(BigObject&&){} void f(BigObject&
我是一名优秀的程序员,十分优秀!