我不打算触及这个问题,因为它是一个非常假设的问题,回答价值不大。但我改变了主意。回答这个我以前不理解的问题很有价值。
考虑通用(不是在 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>