gpt4 book ai didi

c++ - 传递 unique_ptr 右值引用结果编译错误

转载 作者:太空狗 更新时间:2023-10-29 20:20:57 32 4
gpt4 key购买 nike

示例代码如下:

using namespace std;
struct A {
A(unique_ptr<int> s)
: _s(move(s)){}

unique_ptr<int> _s;
};

int main(int argc, const char * argv[]) {

auto&& ptr = make_unique<int>(5);
A a{ptr}; // Error
A b{move(ptr)}; // OK
return 0;
}

我的第一个猜测是它应该在不使用“移动”的情况下工作,但我在 clang 上收到“调用隐式删除的复制构造函数”。也许 'ptr' 的类型不是右值(奇怪?)?有人可以澄清一下吗?

最佳答案

这里有几件事在起作用,其中大部分涉及值(value)类别分类法中各个部分的标准措辞。但这是它的要点:

扣除ptr的类型将遵循转发引用的规则。所以是的,它将是 unique_ptr<int>&& .但是ptr不是右值。这是一件很难理解的事情。当然,它是您绑定(bind)到右值的引用,但现在该对象不再是未命名的,对它的引用也不是。

它现在是一个有名字的对象。直觉上,因为你可以给它赋值,所以它是一个左值(在一般意义上)。因此,它本身不会绑定(bind)到右值引用。所以你最终尝试调用复制构造函数。

要移动它,您需要再次将它转换为到期值(从类型系统的角度来看)。这就是std::move通过返回一个(未命名的)右值引用来做到这一点。

关于c++ - 传递 unique_ptr 右值引用结果编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46783662/

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