5

http://www.reddit.com/r/IAmA/comments/1nl9at/i_am_a_member_of_facebooks_hhvm_team_a_c_and_d/ccjm2qs中,Andrei Alexandrescu 写道:

我认为将右值绑定到 const 引用是导致右值引用兴登堡的一个小错误......这将是一个漫长的讨论。在第一次引入时将右值绑定到 const& 是有意义的(没有模板,很少有细微之处),但从长远来看,在被调用方几乎不可能区分右值和左值。这反过来又迫使一个过于复杂的解决方案(右值引用)作为一种昂贵的解决方案。

如果没有选择将右值绑定到 const 引用,这将如何影响移动语义和完美转发?

4

1 回答 1

6

我不打算触及这个问题,因为它是一个非常假设的问题,回答价值不大。但我改变了主意。回答这个我以前不理解的问题很有价值。

考虑通用(不是在 C++ 中,而是在一般的计算机语言中)API,用于基于一个或多个分隔符将字符串拆分为字符串数组。理想情况下,这会将“字符串视图”或“字符串引用”返回到原始字符串中,以避免复制原始字符串的片段。“字符串视图”或“string_ref”只不过是原始字符串的一对迭代器。所以像:

vector<string_ref> split(const string& str, const string& delim);

已知vector<string_ref>指回str,因此将此函数绑定到右值将是一个坏主意。一旦客户开始使用结果,对参数的引用就会消失。参考文献将悬而未决。

因此,最好禁止该函数接受 的右值参数str,即使它不会修改该参数。

话虽如此,我们几十年的经验强烈表明这个例子并不典型。大多数情况下,如果函数不打算修改参数,那么该参数是右值还是左值都没有关系。

因此,如果我们有一张干净的表格,那么让常见情况成为最容易处理的情况是有意义的:右值可以绑定到const X&. 但是对于像这样的情况split,我们需要语法来禁止这种常见的默认行为。怎么样:

vector<string_ref> split(const string& str, const string& delim);
vector<string_ref> split(const string&& str, const string& delim) = delete;

我很难想出比这更优雅的东西。

换句话说:通常情况下,由于 20/20 事后诸葛亮,并且缺乏向后兼容性限制,如果一张干净的床单,重新设计可以做得更好。但在这种情况下,我假设自己是一张干净的床单,我很难想出比我们现有的更好的设计。

<Disclaimer> 我有偏见。 </Disclaimer>

于 2013-11-05T01:52:36.603 回答