如果右值没有绑定到const引用,这将如何影响移动语义和完美转发
If rvalues did not bind to const references, how would this affect move semantics and perfect forwarding?
Inhttp://www.reddit.com/r/IAmA/comments/1nl9at/i_am_a_member_of_facebooks_hhvm_team_a_c_and_d/ccjm2qs,Andrei Alexandrescu写道:
我认为将右值绑定到常量引用是一个小错误导致右耳值参考兴登堡。。。这将是一个漫长的过程讨论将右值绑定到常量&第一次介绍时很有意义(没有模板,几乎没有微妙之处(,但从长远来看,它实际上无法区分被调用者端的右值和左值。这反过来又迫使一个过于复杂的解决方案(右值引用(昂贵的修复。
如果没有选择将右值绑定到常量引用,这将如何影响移动语义和完美转发?
我不打算碰这个问题,因为这是一个非常假设的问题,回答起来没有多大价值。但我改变了主意。回答这个我以前不理解的问题有的价值。
考虑常见的API(不是在C++中,而是在一般的计算机语言中(,基于一个或多个分隔符将字符串拆分为字符串数组。理想情况下,这将在原始字符串中返回"字符串视图"或"字符串引用",以避免复制原始字符串的片段。"string view"或"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>
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么擦除方法会影响结束方法
- 内联如何影响模块接口中的成员函数
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在容量内调整矢量大小时的性能影响
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 未达到的情况会影响开关外壳性能
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 模板如何影响C++中隐式声明的规则?
- 命名空间信息会影响C++的可读性
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- 检查nullptr是否100%保护内存布局不受segfault影响
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- "virtual"对C++析构函数有何影响?
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- Qt也不例外.这对C++代码有何影响
- 基例如何影响使用递归函数的哪些行