复制C++唯一指针的语义
Copy semantics for C++ unique pointer
如果我写这样的东西,会有什么问题吗:
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却不是。此线程中的更多信息。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- c++在使用指针时移动语义
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 如何包装多级原始指针以赋予其容器语义
- 智能指针移动语义我不清楚
- 如何使用不同的指针算术语义
- 基于指针容器循环的范围内的值语义
- 为什么我们应该使用带有唯一指针的 std::move 语义?
- 在封装指针的类中,移动语义无意中被复制构造函数取代
- 移动语义是否只是一个浅层副本并将其他人的指针设置为 null?
- 明智的指针所有权语义和平等
- C++ 中不同指针语法之间的语义差异
- C/C++ 函数中的引用、指针或值语义
- 传递指向常量指针的指针到字节数组的语义冲突
- 文件输入和指针所有权语义
- 唯一指针xvalue语义?为什么lambda f2的行为与lambda f1不同
- 复制C++唯一指针的语义
- C++11 智能指针语义
- 传递函数指针 - 语义