【发布时间】:2018-12-20 01:47:33
【问题描述】:
如果我们以std::unique_ptr 为例,将只移动类型传递给接收器函数(例如,获取指针所有权的构造函数)的普遍智慧是按值传递它并在调用时移动它地点。例如
class Sink {
public:
Sink(std::unique_ptr<Foo> foo) : foo(std::move(foo)) {}
private:
std::unique_ptr<Foo> foo;
};
这怎么可能?编译器不应该能够立即推断出std::unique_ptr 是一个只移动类型并拒绝使用Sink(std::unique_ptr<Foo>) 吗?这里的按值传递规则有什么特别之处吗(即按值传递的东西被复制到该函数激活框架中)?
提前致谢。
【问题讨论】:
-
foo不用复制进去,也可以移动进去 -
那很好,但不幸的是(或作为历史的一个怪癖)“可移动”概念是相当新的,必须被固定在一种已经非常成熟的语言上。
-
@vu1p3n0x 这是这里缺少的见解,我一直认为按值传递会调用复制构造函数,尽管我现在知道这将取决于在调用站点传入的值的类型(不带移动构造函数的左值和右值的复制构造函数,带移动构造函数的右值的移动构造函数)。
标签: c++ smart-pointers move-semantics pass-by-value