为什么通过显式不可移动和隐式不可复制类型的值返回向量不会产生编译错误?

Bor*_*rov 7 c++ c++11

我有这个简单的示例持有者类,它明确是不可移动的:

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)

......编译好了.

怎么会?这怎么工作?

(可以在这里找到成功编译的示例)

Sho*_*hoe 7

更不用说RVO,矢量可以独立于元素类型的特征移动.