问题标签 [pass-by-rvalue-reference]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3603 浏览

c++ - 在函数返回类型中返回右值引用与按值返回

在我的代码中,我有一个函数,它从一段数据构造一个字符串,然后返回它。该字符串不会在其他任何地方使用,因此接收方可以安全地对其使用移动分配或移动初始化。

这基本上就是我所拥有的。由于返回的值是右值,因此使函数返回类型 std::string&& 有什么意义?

我担心的是,当我们返回字符串时可能会产生多余的副本,并且可以通过将返回类型设置为右值引用来缓解这种情况。

我怀疑编译器也可能能够针对这些场景进行优化,但是,我不确定。

所以问题是 - 在这种情况下将返回类型设为右值引用有什么意义吗?为什么?另外,如果没有,那么返回右值引用的函数有哪些可能的应用?

谢谢。

0 投票
1 回答
782 浏览

c++ - 共享 const 左值 (const T&) 和右值 (T&&) 重载的实现:就像对 const 和非 const 重载所做的那样

背景

以下代码块出现在 Scott Meyers 的名著《Effective C++》第 3 条中:

作者指出,在上述实现中,const和非const重载的内容本质上是相同的。为了避免代码重复,可以这样简化:

问题

我的问题是:

  • 我们什么时候需要一个重载 forconst T&和另一个 for T&&?(这里,T可能是模板参数或类类型,所以T&&可能是也可能不是通用引用)我可以看到在标准库中,许多类都提供了这两种重载。例子是std::pairand的构造函数std::tuple,有大量的重载。(好的,我知道在函数中,一个是复制构造函数,一个是移动构造函数。)

  • 是否有类似的技巧来共享const T&T&&重载的实现?我的意思是,如果const T&&重载返回一个复制构造的对象,而T&&重载返回的是移动构造的对象,那么在共享实现之后,这个属性必须仍然成立。(就像上面的技巧:constreturn constand non- constreturn non- const,在实现共享之前和之后)

谢谢!

澄清

我指的两个重载应该如下所示:

它与通过右值引用返回无关,即:

(顺便说一下,这个问题在我之前的帖子中已经解决了)

f()上面,如果Gadget既可以复制构造又可以移动构造,则没有办法(除了阅读实现)来判断返回值是复制构造还是移动构造。与返回值优化(RVO)/命名返回值优化(NRVO)无关。(见我之前的帖子

参考

有效的 C++

标准::对::对

标准::元组::元组

什么时候是通过右值引用返回的好时机?

0 投票
3 回答
72 浏览

c++ - 这两种函数模板的定义有什么区别?

对比

哪个更好,更推荐?或者有没有比两者都更好的选择?

0 投票
2 回答
64 浏览

c++ - 通过引用作为右值传递

当我尝试将移动成员调用为按引用传递时,编译器会引发错误,但是当我重新定义成员函数以按值传递时,它可以工作。

我不能在成员函数中使用按引用传递作为右值吗?

0 投票
3 回答
2853 浏览

c++ - 返回由右值引用传递的参数

如果我有一个类A和函数

a从返回时调用复制构造函数f,但从 返回时使用移动构造函数g。但是,据我了解,f只能传递一个可以安全移动的对象(临时对象或标记为可移动的对象,例如使用std::move)。从返回时使用移动构造函数不安全时,是否有任何示例f?为什么我们需要a自动存储期限?

我在这里阅读了答案,但最重要的答案仅表明规范在传递a给函数体中的其他函数时不应允许移动;它没有解释为什么返回时搬家是安全的,g但不适合f。一旦我们到达 return 语句,我们将不再需要ainside f

更新 0

所以我知道在完整表达结束之前可以访问临时对象。但是,从f仍然返回时的行为似乎违背了语言中根深蒂固的语义,即移动临时值或 xvalue 是安全的。例如,如果您调用,即使可能有对存储在某处的临时对象的引用,也会g(A())将临时对象移到参数中。g如果我们g使用 xvalue 调用,也会发生同样的情况。a由于只有临时变量和 xvalues 绑定到右值引用,因此在从 返回时我们仍然应该移动的语义似乎是一致的f,因为我们知道a传递的是临时变量或 xvalue。

0 投票
1 回答
86 浏览

c++ - 重用构造函数。将 rvalue 传递给 const lvalue 并且不重复实现

我有一个想法如何简化删除代码重复。请帮助我了解它是否可用,是否良好,并可能让我们升级。

这个电话

据我了解电话#3-> #2-> #1。而这个电话

#2-> #1。这样的实现是否没有提供额外的副本std::string

0 投票
0 回答
44 浏览

c++ - 右值引用只能绑定到非常量右值?

上一篇文章指出右值引用只能绑定到非 const 右值: 返回 const 引用和右值引用的区别

但是,如果这是真的,那么完美转发的工作原理是什么?

对于完美转发的这个定义:

看起来工厂函数可以接受任何类型的数据:const lvalue、lvalue、rvalue。

(PS似乎右值引用可以做任何事情,但我很少看到其他人使用它编写代码,为什么不呢?似乎函数参数的右值引用不仅可以做左值引用可以做的事情,而且还可以通过避免不必要的副本来提高效率)

0 投票
4 回答
168 浏览

c++ - 在 C++ 中使用右值设置类变量的最有效方法是什么?

我刚开始使用 c++11 r-values。我阅读了一些教程,但我还没有找到答案。

设置类变量的最佳方式(最有效的方式)是什么?下面的代码是否正确?(假设 std::string 已经定义了移动构造函数和赋值运算符)。

我知道编译器可以优化我的代码和/或我可以使用重载函数。我只想知道什么是最好的方法。

0 投票
0 回答
888 浏览

parameter-passing - 传递结果和传递值结果有什么区别?

我找到了这个解释:

按值调用:复制进入过程

按结果调用:复制出过程

按值调用结果:复制进来,然后再出去

但是我不明白,如果我们不复制输入,结果调用与引用调用有何不同,以及我们在程序结束时复制的内容。谁能解释一下?

0 投票
2 回答
445 浏览

c++ - 右值引用与左值引用具有相同的开销吗?

考虑这个例子:

是否foo<int&&>(i)一样快foo<int>(i),或者它是否涉及指针开销foo<int&>(i)

编辑:正如建议的那样,运行g++ -S给了我相同的 51 行汇编文件foo<int>(i)foo<int&>(i),但foo<int&&>(std::move(i))产生了 71 行汇编代码(看起来差异来自std::move)。

编辑:感谢那些推荐g++ -S不同优化级别的人——使用-O3(和制作 foo noinline)我能够获得看起来像xaxxon 解决方案的输出输出。