gpt4 book ai didi

c++ - 在通用引用上前进与前进

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:35 26 4
gpt4 key购买 nike

我正在通过对通用引用应用 std::movestd::forward 来尝试一个程序。直到今天,我都认为两者是相同的,但在这个程序(如下所示)中,输出让我感到惊讶。

#include <iostream>
#include <string>
#include <utility>
using namespace std;

class X
{
string take="";
public:
template<class T>
void pass1 (T &&str) // str is a universal reference as it can bind to anything, both rvalue and lvalue references
{
take=move(str);
}
template<class T>
void pass2 (T &&str)
{
take=forward<T>(str);
}
void show()
{
cout<<"take = "<<take<<"\n";
}
}obj;

int main()
{
cout<<"using move on universal reference:-\n";
string str="he is there";
cout<<"str = "<<str<<'\n';
obj.pass1(str);
obj.show();
if (str.empty())
cout<<"str is empty\n\n";
else
cout<<"str isnt empty\n\n";
cout<<"using forward on universal reference:-\n";
str="he was there";
cout<<"str = "<<str<<'\n';
obj.pass2(str);
obj.show();
if (str.empty())
cout<<"str is empty\n\n";
else
cout<<"str isnt empty\n\n";
return 0;
}

输出:

using move on universal reference:-
str = he is there
take = he is there
str is empty

using forward on universal reference:-
str = he was there
take = he was there
str isnt empty
*/

我的问题是:

  1. 为什么输出不同?
  2. 难道 moveforward 的工作方式相似吗?它们的工作方式有何不同(在上述代码的上下文中)?

最佳答案

T && 已重命名为转发引用。

在您的第一个示例中,您明确调用了 std::move所以 str 成为右值引用,它的内容从 main move 到 X 中的成员。

在第二个示例中,您使用 std::forward .当 T 是右值引用时,在 T 上调用 std::forward 会将右值引用转发给 operator=operator=(std::String&&) 将被调用。如果 T 是左值,则传递左值引用。因为我们有一个左值,所以 operator=(const std::string&) 将被调用,我们复制 str 而不是从它 move 。

关于c++ - 在通用引用上前进与前进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32952913/

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