提问者:小点点

右值的值是什么?[重复]


也就是说,当利用C 11 typename时,通常会在设计良好的C 03代码中获得多少性能改进

编辑:

想象一个替代的宇宙,在这个宇宙中,不是右值引用C 11,而是用一个关键字“返回”来扩展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和右值引用一样,并且会造成更少的混乱和潜在的陷阱。三规则将仍然是三规则,而不是成为五规则;不会混淆是否

我错过了什么?


共1个答案

匿名用户

右值引用的价值主要不在于性能。相反,它在于表现力。没有右值引用,您无法以有用的方式在类型系统中编码所有权。由于右值引用允许的所有权转移,我们现在可以编写完全子表达式正确的代码,没有非本地依赖关系。

例如,C 11之前:

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

                         // ... keep paying attention...

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

带右值:

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

请注意,现代示例的任何子表达式本身都不是资源bug的根本原因。同样的方法可以应用于无数资源/句柄对:内存/指针、文件/句柄、互斥锁/锁、任务/延续等。

(如果您将资源获取和释放视为两个相反的极点,那么现代C应该像磁铁一样书写:两者始终作为一个实体的一部分在一起。)

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