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



如果我写这样的东西,会有什么问题吗:

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

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

std::unique_ptr没有复制构造函数。你在那里所做的与用unique_ptr赋值相同:指针被移动。(尽管在某些情况下,你必须显式地move()指针,否则你会得到编译错误;但如果编译器没有抱怨错误,那么它会悄悄地移动指针)

在return语句中,可以执行重载解析,就好像return语句中的id表达式指定了一个右值:

当满足省略复制/移动操作的条件[..]、时,或者当返回语句中的表达式是带括号)id表达式,该表达式命名具有在正文中声明的自动存储持续时间的对象[..],重载解析首先执行为副本选择构造函数的操作,就好像对象是由右值指定的一样。

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

请注意,如果您的编译器不支持重载解析的第一阶段,并且当返回表达式的类型与函数的返回类型不具有相同的cv非限定类型时,将s视为右值,则可能仍然需要std::move()。clang的trunk版本似乎就是这样,但gcc却不是。此线程中的更多信息。

最新更新