rvalues的价值是什么?

Mic*_*ael 1 c++ rvalue-reference language-lawyer move-semantics c++11

也就是说,当一个人利用C++ 11 typename &&功能(如移动构造函数等)时,通常会在设计良好的C++ 03代码中获得多少性能提升?多长时间值得麻烦,在什么情况下?

编辑:

想象一个替代的宇宙,而不是右值引用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.
}
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么?

Ker*_* SB 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?
Run Code Online (Sandbox Code Playgroud)

rvalues:

auto p = std::make_unique<int[]>(N);   // fine
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 加上一个像往常一样.如果我能负担得起你,我会试着雇用你! (3认同)