rvalues的价值是什么?

时间:2015-06-03 18:54:53

标签: c++ c++11 language-lawyer move-semantics rvalue-reference

也就是说,当一个人充分利用C ++ 11 typename&& amp;移动构造函数等功能?它在多大程度上值得麻烦,在什么情况下?

编辑:

想象一个替代的Universe,而不是rvalue引用C ++ 11使用关键字“returns”扩展C ++ 03,该关键字标记将由函数返回的局部变量。如果局部变量被标记为“返回”,则将其放置在堆栈中通常存在返回值的部分中。想象一下,您可以使用这样的关键字:

SomeClass foo()
{
    returning SomeClass bar; // Created where return value usually resides.
    // do something with bar
    return bar; // No copy constructor is involved here.
}

我认为这样的机制可以创建make_unique,这样就像rvalue引用一样,并且可以减少混乱和潜在的陷阱。三法则仍然是三法则而不是成为五法则;不会混淆和&&如果rvalue ref或通用ref;没有必要使用std :: move等。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:7)

rvalue引用的值并不主要在于性能。更确切地说,它在于表现力。如果没有右值引用,则无法以有用的方式对类型系统中的所有权进行编码。由于rvalue引用允许的所有权转移,我们现在可以编写完全没有非本地依赖性的子表达式正确代码。

例如,pre-C ++ 11:

int * p = new int[N];    // may be a bug, who knows?

                         // ... keep paying attention...

delete p;                // ah, no bug... or is it?

使用rvalues:

auto p = std::make_unique<int[]>(N);   // fine

请注意,现代示例中没有单个子表达式本身就是资源错误的根本原因。相同的方法可以应用于无数的资源/句柄对:内存/指针,文件/句柄,互斥/锁定,任务/继续等。

(如果你认为资源获取和释放是两个相反的两极,那么现代C ++应该像磁铁一样写:两者总是作为一个实体的一部分组合在一起。)

允许类型系统完全保证正确性的位置是语言的显着改进。