独特的 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)详解

move语义笔记

第15课 右值引用_std::move和移动语义

Move语义和Smart Pointers先导(以一个例子说明)

(译)C++11中的Move语义和右值引用