问题标签 [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.
c++ - 在函数返回类型中返回右值引用与按值返回
在我的代码中,我有一个函数,它从一段数据构造一个字符串,然后返回它。该字符串不会在其他任何地方使用,因此接收方可以安全地对其使用移动分配或移动初始化。
这基本上就是我所拥有的。由于返回的值是右值,因此使函数返回类型 std::string&& 有什么意义?
我担心的是,当我们返回字符串时可能会产生多余的副本,并且可以通过将返回类型设置为右值引用来缓解这种情况。
我怀疑编译器也可能能够针对这些场景进行优化,但是,我不确定。
所以问题是 - 在这种情况下将返回类型设为右值引用有什么意义吗?为什么?另外,如果没有,那么返回右值引用的函数有哪些可能的应用?
谢谢。
c++ - 共享 const 左值 (const T&) 和右值 (T&&) 重载的实现:就像对 const 和非 const 重载所做的那样
背景
以下代码块出现在 Scott Meyers 的名著《Effective C++》第 3 条中:
作者指出,在上述实现中,const
和非const
重载的内容本质上是相同的。为了避免代码重复,可以这样简化:
问题
我的问题是:
我们什么时候需要一个重载 for
const T&
和另一个 forT&&
?(这里,T
可能是模板参数或类类型,所以T&&
可能是也可能不是通用引用)我可以看到在标准库中,许多类都提供了这两种重载。例子是std::pair
and的构造函数std::tuple
,有大量的重载。(好的,我知道在函数中,一个是复制构造函数,一个是移动构造函数。)是否有类似的技巧来共享
const T&
和T&&
重载的实现?我的意思是,如果const T&&
重载返回一个复制构造的对象,而T&&
重载返回的是移动构造的对象,那么在共享实现之后,这个属性必须仍然成立。(就像上面的技巧:const
returnconst
and non-const
return non-const
,在实现共享之前和之后)
谢谢!
澄清
我指的两个重载应该如下所示:
它与通过右值引用返回无关,即:
(顺便说一下,这个问题在我之前的帖子中已经解决了)
在f()
上面,如果Gadget
既可以复制构造又可以移动构造,则没有办法(除了阅读实现)来判断返回值是复制构造还是移动构造。与返回值优化(RVO)/命名返回值优化(NRVO)无关。(见我之前的帖子)
参考
c++ - 这两种函数模板的定义有什么区别?
对比
哪个更好,更推荐?或者有没有比两者都更好的选择?
c++ - 通过引用作为右值传递
当我尝试将移动成员调用为按引用传递时,编译器会引发错误,但是当我重新定义成员函数以按值传递时,它可以工作。
我不能在成员函数中使用按引用传递作为右值吗?
c++ - 返回由右值引用传递的参数
如果我有一个类A
和函数
a
从返回时调用复制构造函数f
,但从 返回时使用移动构造函数g
。但是,据我了解,f
只能传递一个可以安全移动的对象(临时对象或标记为可移动的对象,例如使用std::move
)。从返回时使用移动构造函数不安全时,是否有任何示例f
?为什么我们需要a
自动存储期限?
我在这里阅读了答案,但最重要的答案仅表明规范在传递a
给函数体中的其他函数时不应允许移动;它没有解释为什么返回时搬家是安全的,g
但不适合f
。一旦我们到达 return 语句,我们将不再需要a
inside f
。
更新 0
所以我知道在完整表达结束之前可以访问临时对象。但是,从f
仍然返回时的行为似乎违背了语言中根深蒂固的语义,即移动临时值或 xvalue 是安全的。例如,如果您调用,即使可能有对存储在某处的临时对象的引用,也会g(A())
将临时对象移到参数中。g
如果我们g
使用 xvalue 调用,也会发生同样的情况。a
由于只有临时变量和 xvalues 绑定到右值引用,因此在从 返回时我们仍然应该移动的语义似乎是一致的f
,因为我们知道a
传递的是临时变量或 xvalue。
c++ - 重用构造函数。将 rvalue 传递给 const lvalue 并且不重复实现
我有一个想法如何简化删除代码重复。请帮助我了解它是否可用,是否良好,并可能让我们升级。
这个电话
据我了解电话#3
-> #2
-> #1
。而这个电话
#2
-> #1
。这样的实现是否没有提供额外的副本std::string
?
c++ - 右值引用只能绑定到非常量右值?
上一篇文章指出右值引用只能绑定到非 const 右值: 返回 const 引用和右值引用的区别
但是,如果这是真的,那么完美转发的工作原理是什么?
对于完美转发的这个定义:
看起来工厂函数可以接受任何类型的数据:const lvalue、lvalue、rvalue。
(PS似乎右值引用可以做任何事情,但我很少看到其他人使用它编写代码,为什么不呢?似乎函数参数的右值引用不仅可以做左值引用可以做的事情,而且还可以通过避免不必要的副本来提高效率)
c++ - 在 C++ 中使用右值设置类变量的最有效方法是什么?
我刚开始使用 c++11 r-values。我阅读了一些教程,但我还没有找到答案。
设置类变量的最佳方式(最有效的方式)是什么?下面的代码是否正确?(假设 std::string 已经定义了移动构造函数和赋值运算符)。
我知道编译器可以优化我的代码和/或我可以使用重载函数。我只想知道什么是最好的方法。
parameter-passing - 传递结果和传递值结果有什么区别?
我找到了这个解释:
按值调用:复制进入过程
按结果调用:复制出过程
按值调用结果:复制进来,然后再出去
但是我不明白,如果我们不复制输入,结果调用与引用调用有何不同,以及我们在程序结束时复制的内容。谁能解释一下?
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 解决方案的输出输出。