gpt4 book ai didi

c++ - std::move 和 std::forward 之间的混淆

转载 作者:行者123 更新时间:2023-11-28 04:47:58 24 4
gpt4 key购买 nike

<分区>

所以我只是在编写 std::forward 的示例和人为示例据我了解,但它没有按我预期的方式工作。在下面的程序中

#include <string>
#include <iostream>

struct A
{
A(const std::string& m) : m_(m) {};
std::string m_;
};

template<typename T>
void funcB(T&& obj) // universal reference
{
std::string local = std::move(obj.m_); // using std::move on universal reference. Bad.
std::cout << "funcB : " << local << '\n';
}

template<typename T>
void funcC(T&& obj) // universal reference
{
std::string local = std::forward<std::string>(obj.m_); // using std::move on universal reference
std::cout << "funcC : " << local << '\n';
}

template<typename T>
void funcD(T&& obj) // universal reference
{
T local = std::forward<T>(obj); // using std::move on universal reference
std::cout << "funcD : " << local.m_ << '\n';
}

int main()
{
A obj("firstString");

//funcA(obj); // We get compiler error. Rvalue reference cannot be bound to Lvalue
funcB(obj);
std::cout << "Main : " << obj.m_ << '\n';

A obj2("secondString");
funcC(obj2);
std::cout << "Main : " << obj2.m_ << '\n';

A obj3("thirdString");
funcD(obj3);
std::cout << "Main : " << obj3.m_ << '\n';
}

在输出中

funcB : firstString
Main :
funcC : secondString
Main :
funcD : thirdString
Main : thirdString

funcC ,即使我使用了通用引用并且这里它绑定(bind)到左值,当我执行 std::forward<std::string> 时字符串也会被移动.因此在最后一行,“Main:”之后没有输出。即使 obj 绑定(bind)到左值,有人可以请教如何移动字符串吗?

在重读一本书后,才知道这个问题的答案。

在 funcC 中,std::forward<std::string>(obj.m_)相当于移动字符串。但是在 funcD 中,std::forward被实例化为 std::forward<struct A&>(obj) , 这是复制的。

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