gpt4 book ai didi

c++ - 如何使用 move 语义链接函数?

转载 作者:行者123 更新时间:2023-11-28 03:08:43 25 4
gpt4 key购买 nike

在下面的示例中,我想通过函数 foo 和 bar move “a”。为什么“pp”的地址在bar函数中改变了?我不明白为什么。我期望它与 foo 中的“tt”相同,这与 main 中的“a”相同。

#include <iostream>
#include <utility>
struct A
{
int a_;
};

template<typename T>
A foo(T &&t)
{
auto &&tt = std::move(t);
tt.a_ -= 3;
std::cout << "tt=" << tt.a_ << "\t&tt=" << &tt << "\n";
return tt;
}

template<typename T>
A bar(T &&p)
{
auto &&pp = std::move(p);
pp.a_++;
std::cout << "pp=" << pp.a_ << "\t&pp=" << &pp << "\n";
return pp;
}

int main()
{
A a;
a.a_ = 12;
std::cout << "a=" << a.a_ << "\t&a=" << &a << "\n";
foo(std::move(a));
std::cout << "a=" << a.a_ << "\t&a=" << &a << "\n";
std::cout << "function chain=" << bar(std::move(foo(std::move(a)))).a_ << "\n";
std::cout << "a=" << a.a_ << "\t&a=" << &a << "\n";
return 0;
}

最佳答案

几点:

  • move 对象仍然意味着存在具有不同地址的不同实例。如果一个实例被 move ,则意味着它的内容以比仅仅复制内容更有效的方式从一个实例 move 到另一个实例。在您的示例中,没有任何东西真正 move ,但我认为您已经意识到这一点。

  • 您从 foobar 返回一个新的 A 实例。这是创建新实例的地方。您调用 bar(std::move(foo(std::move(a)))) 并且内部部分 foo(std::move(a)) 返回一个新的临时。然后将该临时值传递给 bar

  • 注意 bar(std::move(foo(std::move(a)))) 是不必要的 long,bar(foo(std::move( a))) 就足够了,因为临时对象已经是右值了。

关于c++ - 如何使用 move 语义链接函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19038219/

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