C++ 无法使用通用引用 move unique_ptr

标签 c++ c++11 move-semantics unique-ptr universal-reference

考虑这段代码:

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 函数应该简单地接受一个通用引用并按值返回它,但是通过 move 而不是复制它。因此,调用此方法时不应涉及复制。因此,使用只能 move 的 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_ptr 的复制构造函数,这当然被删除了。但是为什么这里会出现拷贝呢?我怎样才能编译这段代码?

最佳答案

我认为错误出在 mov 的返回类型中

代码应该是这样的

#include <utility>
#include <memory>
template<typename T>
typename std::remove_reference<T>::type&& mov(T&& t){
   return std::move(t);
}

int main(){
   std::unique_ptr<int> a = std::unique_ptr<int>(new int());
   auto b = mov(a);
}

这个问题暗示了按值返回的场景,这也可以编译。我不确定它是否适用于您的情况;

template<typename T>
typename std::remove_reference<T>::type mov(T&& t){
   return std::move(t);
}

关于C++ 无法使用通用引用 move unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24884663/

相关文章:

c++ - 用堆栈计算表达式

c++ - undefined reference

c++ - 是否有用于将特定 IR 编译为体系结构特定代码的 LLVM 替代库?

c++ - 从成员的地址获取成员的索引

c++ - 按值传递和 move ,或两种方法

c++ - 初始化列表和 move 语义

C++ 二维数组算术问题

c++ - 在没有定义的情况下按值传递空变量是否安全?

c++ - 将变量的名称传递给 C++ 中的函数

c++ - 使用 move 构造函数