复制C ++唯一指针的语义

时间:2015-02-15 20:23:02

标签: c++ c++11 unique-ptr

如果我写下这样的话会有什么问题:

Try<std::unique_ptr<int> > some_function() {
  std::unique_ptr<int> s(new int(2));
  return s;
}

是否调用了复制构造函数?我应该使用std :: move吗?

2 个答案:

答案 0 :(得分:4)

std::unique_ptr doesn't have a copy constructor。你在那里做的与使用unique_ptr的assigning相同:指针被移动。 (虽然在某些情况下你必须明确地move()指针,否则你会得到一个编译错误;但如果编译器没有抱怨错误,那么它正在悄悄地移动指针)

答案 1 :(得分:3)

在return语句中,可以执行重载解析,就好像return语句中的id-expression指定了一个rvalue:

  

当满足复制/移动操作的省略标准时,[..],或者当返回语句中的表达式为(可能)时   括号)id-expression命名一个具有在体内声明的自动存储持续时间的对象 [..],重载分辨率   首先执行选择复制的构造函数,就好像该对象是由右值指定的。

因此,您的案例确实符合NRVO,因为s在函数体中声明,因此不需要std::move(),因为重载解析可以将s视为右值。

请注意,如果您的编译器在返回表达式的类型不适合的情况下不支持将std::move()作为右值处理的第一阶段的重载决策,则可能仍需要s具有与函数返回类型相同的cv-nonqualified类型。这似乎是clang的主干版本而不是gcc的情况。有关this thread的更多信息。