当您使用 std::move 返回时,"return-by-rvalue-ref" 和 "return-by-value" 之间的区别?
Difference between "return-by-rvalue-ref" & "return-by-value" when you return using std::move?
考虑以下代码:
#include <iostream>
using namespace std;
struct I {
I(I&& rv) { cout << "I::mvcotr" << endl; }
};
struct C {
I i;
I&& foo() { return move(i) };
}
};
int main() {
C c;
I i = c.foo();
}
C包含I,而C::foo()允许您将I移出C。
I&& foo() { return move(i) }; // return rvalue ref
和以下替代成员函数:
I foo() { return move(i) }; // return by value
对我来说,它们似乎做同样的事情:I i = c.foo();
导致对I::I(I&&);
的调用。
本例中没有涉及的后果是什么?
不考虑您编写的程序是否真正有意义(从数据成员移动是尴尬的-但是好吧,也许有一些用例),在这种情况下,该函数的两个版本最终做同样的事情。
作为一般实践,您应该更喜欢按值返回,因为在许多情况下,它允许编译器执行复制省略并省略对返回类型的move构造函数的调用,正如c++ 11标准第12.8/31段所允许的那样。
复制省略允许编译器直接在对象中创建函数的返回值,该对象应该从函数的返回值初始化。
因此,作为一般准则,更倾向于按值返回。
相关文章:
- 方法错误"not all control paths return a value"和方法不返回值
- 如何解决类成员函数中的"return a value"错误?
- 从函数 BY VALUE 返回数组,返回结构时会发生什么?
- 警告:"Not all control paths return a value" c++
- 传递类 by-value 时,调用方或被调用方是否调用析构函数
- 对于具有抛出复制构造函数和noexcept-by-value复制赋值的类,is_nothrow_copy_assigna
- "All arguments to functions are passed by value" C 中的,C++ 中对引用传递的混淆
- 虚假"<function> is expected to return a value"警告?
- "Want Speed? Pass by value"有多真实
- 我返回一个值,但编译器告诉我"function must return a value"
- 为什么程序员说"pass by reference"真的很"passing references by value?"为什么这很重要?
- Boost.Python boost::shared_ptr no to python by value convert
- Lambda Capture by Value强制所有作用域对象为常量
- 计算距离:方法"must return a value" ?
- "return-by-reference"或"pass-by-reference"参数何时与constexpr兼容?
- C++错误"not all control paths return a value"
- C++ lambda & std::function capture by value memory management?
- 当您使用 std::move 返回时,"return-by-rvalue-ref" 和 "return-by-value" 之间的区别?
- std::bind 绑定"by value",这是真的吗?
- operator=使用move assign和pass by value copy assign的歧义重载