【发布时间】:2023-03-30 19:21:01
【问题描述】:
考虑这段代码:
template<typename T>
T mov(T&& t){
return std::move(t);
}
int main(){
std::unique_ptr<int> a = std::unique_ptr<int>(new int());
std::unique_ptr<int> b = mov(a);
}
mov 函数应该简单地接受一个通用引用并按值返回它,但通过 moveing 它而不是复制它。因此,调用此方法时不应涉及复制。因此,使用只能移动的unique_ptr 调用这样的函数应该没问题。但是,此代码无法编译:我收到错误:
test.cpp:24:34: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’
std::unique_ptr<int> b = mov(a);
因此,C++ 似乎试图调用unique_ptrs 复制构造函数,这当然被删除了。但是为什么这里会出现副本呢?如何编译这段代码?
【问题讨论】:
-
std::unique_ptr<int> b = mov(std::move(a));有效应该是对问题的提示。 -
@WhozCraig:我特别想避免这里的
move。否则,我不需要通用引用而是右值引用。通用引用的意义在于它也可以持有一个普通的左值引用。 -
那我看不到结局了。你认为
a和mov没有按照我的评论移动的内容是什么?T&&没有像您编写的那样提升为 xvalue。它需要被移动(或者我只是没有看到它,这不会是第一次)。 -
就可以了。毫不奇怪,它与我的实现(clang 3.4)中的
std::move几乎相同。格拉茨! -
好的,我买那个。试图了解可能的用例是什么,直到该评论。谢谢!。
标签: c++ c++11 move-semantics unique-ptr universal-reference