Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果右值未绑定到常量引用,这将如何影响移动语义和完美转发?_C++_C++11 - Fatal编程技术网

C++ 如果右值未绑定到常量引用,这将如何影响移动语义和完美转发?

C++ 如果右值未绑定到常量引用,这将如何影响移动语义和完美转发?,c++,c++11,C++,C++11,安德烈·亚历山德雷斯库在书中写道: 我认为将右值绑定到常量引用是一个小错误 引起了对兴登堡的右旋参考。。。这将是一个漫长的过程 讨论。将rvalues绑定到const&首次引入时很有意义 (没有模板,没有什么微妙之处)但从长远来看,它实际上是成功的 无法区分被调用方端的右值和左值。 这反过来又迫使一个过于复杂的解决方案(右值引用)成为可能 昂贵的修理费 如果没有选择将右值绑定到常量引用,这将如何影响移动语义和完美转发?我不打算触及这个问题,因为这是一个非常假设的问题,回答起来没有多大价值。但我改

安德烈·亚历山德雷斯库在书中写道:

我认为将右值绑定到常量引用是一个小错误 引起了对兴登堡的右旋参考。。。这将是一个漫长的过程 讨论。将rvalues绑定到const&首次引入时很有意义 (没有模板,没有什么微妙之处)但从长远来看,它实际上是成功的 无法区分被调用方端的右值和左值。 这反过来又迫使一个过于复杂的解决方案(右值引用)成为可能 昂贵的修理费


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

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

考虑常见的(不在C++中,但在计算机语言中)API,将一个字符串分割成一个或多个分隔符的字符串数组。理想情况下,这会将“字符串视图”或“字符串参考”返回到原始字符串中,以避免复制原始字符串的片段。“string视图”或“string_ref”只不过是原始字符串中的一对迭代器。比如:

vector<string_ref> split(const string& str, const string& delim);
我想不出比这更优雅的了

换句话说:通常情况下,在20/20事后诸葛亮的情况下,如果没有向后兼容性约束,重新设计可以做得更好。但在这种情况下,我假设自己是一个清白的人,我很难想出比我们更好的设计

我有偏见。

这是安德烈·亚历山德雷斯库的观点。那我们怎么能支持他的主张呢?如果它是一般的社区意见,那么我们可以备份,但它是个人的意见,往往对许多事情有不同的看法,如迭代器,很好地被C++专家所接受。我们不需要在被叫方进行区分。它作为常量引用传递,并且应该是可读的,而不是可写的。而右值引用并不过于复杂。我重新编写了这个问题,使其符合事实,而不是基于观点。如果右值不绑定到常量引用,它们绑定到什么?没有什么?非
const
引用?仅实例?我在一个项目中遇到过这个问题。我们基本上决定记录行为,并让用户负责确保可视对象不是临时的(或超出范围)。当然不太好。@KonradRudolph:你能用这个答案中演示的重载删除函数来执行你的策略吗?(假设您的编译器实现了C++11)。这是C++11之前的方式。
delete
d函数当然会起作用,但只会阻止使用临时变量,而不会阻止视图超过其宿主对象的其他情况。@KonradRudolph:我猜其他情况不会阻止临时变量(右值)是否绑定到常量左值引用(OP问题的前提)。@Howard,你还记得这个简单的计划是什么吗?“我紧跟C++的RValk提案,并且在一个时候我建议了一个更简单的方案,Howard Hinnant证明我会破坏兼容性(这是一个“否”)。
vector<string_ref> split(const string& str, const string& delim);
vector<string_ref> split(const string&& str, const string& delim) = delete;