在下面的例子中,我想通過函數foo和bar來移動「a」。爲什麼「pp」的地址在條形函數中發生變化?我不明白爲什麼。我期待它與「tt」在foo中相同,這與「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;
}