我有这个简单的示例持有者类,它明确是不可移动的:
template <typename T>
struct holder
{
holder() = default;
holder(const holder& b)
: t(b.t)
{
}
holder(holder&& b) = delete;
holder& operator=(const holder& b)
{
t = b.t;
return *this;
}
holder& operator=(holder&& b) = delete;
T t;
};
Run Code Online (Sandbox Code Playgroud)
因此,以下类型也是隐式不可复制的(因为std::unique_ptr这样):
typedef holder<std::unique_ptr<int>> ptr;
Run Code Online (Sandbox Code Playgroud)
所以,正如我所期望的那样,如果我有一个函数ptr foo();,可以通过它调用它,auto x = foo;或者ptr x; x = foo();产生一个编译错误,即调用一个已删除的函数.
但是,如果我引入另一种类型的ptr矢量,如下所示:
typedef std::vector<ptr> vec;
vec foo();
int main()
{
vec x = foo();
x = foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
......编译好了.
怎么会?这怎么工作?
(可以在这里找到成功编译的示例)