gpt4 book ai didi

c++ - std::move 和 std::forward 有什么区别

转载 作者:IT老高 更新时间:2023-10-28 11:30:48 25 4
gpt4 key购买 nike

我在这里看到了这个: Move Constructor calling base-class Move Constructor

谁能解释一下:

  1. std::move 之间的区别和 std::forward ,最好有一些代码示例?
  2. 如何轻松思考,何时使用哪个

最佳答案

std::move 接受一个对象并允许您将其视为临时对象(右值)。尽管这不是语义要求,但通常接受对右值的引用的函数会使它无效。当你看到std::move时,表示该对象的值以后不应该被使用,但你仍然可以分配一个新的值并继续使用它。

std::forward 有一个用例:将模板函数参数(在函数内部)转换为调用者用来传递它的值类别(左值或右值)。这允许将右值参数作为右值传递,将左值作为左值传递,这种方案称为“完美转发”。

illustrate :

void overloaded( int const &arg ) { std::cout << "by lvalue\n"; }
void overloaded( int && arg ) { std::cout << "by rvalue\n"; }

template< typename t >
/* "t &&" with "t" being template param is special, and adjusts "t" to be
(for example) "int &" or non-ref "int" so std::forward knows what to do. */
void forwarding( t && arg ) {
std::cout << "via std::forward: ";
overloaded( std::forward< t >( arg ) );
std::cout << "via std::move: ";
overloaded( std::move( arg ) ); // conceptually this would invalidate arg
std::cout << "by simple passing: ";
overloaded( arg );
}

int main() {
std::cout << "initial caller passes rvalue:\n";
forwarding( 5 );
std::cout << "initial caller passes lvalue:\n";
int x = 5;
forwarding( x );
}

正如霍华德所提到的,这两个函数也有相似之处,因为这两个函数都只是转换为引用类型。但在这些特定用例(涵盖 99.9% 的右值引用强制转换的有用性)之外,您应该直接使用 static_cast 并为您正在做的事情写一个很好的解释。

关于c++ - std::move 和 std::forward 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671749/

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