gpt4 book ai didi

c++ - 如果右值没有绑定(bind)到 const 引用,这将如何影响移动语义和完美转发?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:59 26 4
gpt4 key购买 nike

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

I think binding rvalues to const references has been the small mistake that caused the rvalue references Hindenburg... It would be a long discussion. Binding rvalues to const& made sense when first introduced (no templates, few subtleties) but in the long term made it virtually impossible to distinguish rvalues from lvalues on the callee side. That in turn forced an overly complex solution (rvalue references) as an expensive fix.

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

最佳答案

我不打算触及这个问题,因为它是一个极端假设的问题,没有太大的回答值(value)。但我改变了主意。回答这个我以前没有理解的问题的值(value)。

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

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

众所周知vector<string_ref>指回到str ,将此函数绑定(bind)到右值将是一个坏主意。一旦客户端开始使用结果,对参数的引用就会消失。引用将是悬空的。

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

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

因此,如果我们有一张干净的纸,那么让常见情况成为最容易处理的情况是有意义的:右值可以绑定(bind)到 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>

关于c++ - 如果右值没有绑定(bind)到 const 引用,这将如何影响移动语义和完美转发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19762045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com