独特的 ptr 和移动语义

unique ptr and move semantics

我有以下关于唯一指针和所有权转移的问题 假设如下

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) 有效? 谢谢

std::unique_ptr 有一个右值构造函数,因此您可以从右值构造一个。调用以 class 类型作为参数的函数只需要为 class1 有一个 1 参数的非显式构造函数,它可以构造class 从提供给调用的参数类型。


1这不是调用此类函数的唯一方法;还有其他涉及显式转换运算符的方法