独特的 ptr 和 move 语义
Posted
技术标签:
【中文标题】独特的 ptr 和 move 语义【英文标题】:unique ptr and move semantics 【发布时间】:2017-11-23 18:14:26 【问题描述】:我有以下关于唯一指针和所有权转移的问题 假设如下
class Base
Base()
void foo(unique_ptr<Base> p)
;
void main()
Base b;
b.foo(std::unique_ptr<Base> p(new Base);
上面的代码部分创建了一个临时唯一指针,我预计会出现编译错误。但是代码可以编译。 我希望唯一有效的函数原型是
void foo(unique_ptr<Base> && p)
我很惊讶,函数的两个签名是有效的。 你能解释一下为什么当我们传递一个右值引用时 void foo(unique_ptr p) 是有效的吗? 谢谢你
【问题讨论】:
由于括号不匹配,代码无法编译... 【参考方案1】:std::unique_ptr
有一个右值构造函数,所以你可以从一个右值构造一个。调用将类类型作为参数的函数只需要该类1 有一个单参数非显式构造函数,该构造函数可以从提供给调用的参数构造类类型。
1这不是调用此类函数的唯一方法;还有其他涉及显式转换运算符的方法
【讨论】:
以上是关于独特的 ptr 和 move 语义的主要内容,如果未能解决你的问题,请参考以下文章
C++11的右值引用移动语义(std::move)和完美转发(std::forward)详解