【发布时间】:2020-05-04 16:48:07
【问题描述】:
我得到了一些类似这样的代码
struct A
{
int i;
A(int i) : i(i) {}
~A()
{
cout << "destroy " << i << endl;
}
};
using p = shared_ptr<A>;
p f(int i)
{
return make_shared<A>(i);
}
int main()
{
auto i = f(1);
cout << "a" << endl;
p && j = f(2);
cout << "a" << endl;
p && k = move(f(3));
cout << "a" << endl;
auto l = move(f(4));
cout << "a" << endl;
p ptr = make_shared<A>(5);
auto && a = move(ptr);
cout << "a" << endl;
}
输出是
a
a
destroy 3
a
a
a
destroy 5
destroy 4
destroy 2
destroy 1
我不明白为什么move 一个函数返回到右值引用的值会导致破坏。不过直接放到一个右值引用就可以了。
问题实际上是在std::get<> 的std::tuple 中发现的。我有一个函数返回两个 shared_ptr 的元组并使用 std::get 来访问该元素。但我发现auto && i = get<0>(f()) 会导致错误,但auto i = get<0>(f()) 不会。然后我为 std::move 找到了一个类似但更简单的情况
【问题讨论】:
-
请不要问 XY 问题。如果您想使用
std::tuple查询某些std::get<>的使用情况,请为此创建一个单独的问题。 -
@KamilCuk:这是一个合理的问题,有时会令人困惑。
-
标签: c++ reference move shared-ptr