c++ - 为什么按显式不可移动和隐式不可复制类型的值返回 vector 不会产生编译错误?

标签 c++ c++11

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

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;
};

因此,以下类型也是隐式不可复制的(因为 std::unique_ptr 是这样的):

typedef holder<std::unique_ptr<int>> ptr;

所以,如果我有像 ptr foo(); 这样的函数,我会期望通过 auto x = foo;ptr x 调用它; x = foo(); 产生编译错误,指出正在调用已删除的函数。

但是,如果我像这样引入另一种类型的 ptr vector :

typedef std::vector<ptr> vec;

vec foo();

int main()
{
    vec x = foo();
    x = foo();
    return 0;
}

...编译正常。

怎么会?这是如何工作的?

(可以找到编译成功的例​​子here)

最佳答案

更不用说 RVO 了, vector 可以独立于元素类型的特征移动。

关于c++ - 为什么按显式不可移动和隐式不可复制类型的值返回 vector 不会产生编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39033951/

相关文章:

c++ - 在 LLVM libc++ 中找到的 string::find 中实现的算法(及其复杂性)是什么?

c++ - 编译时生成一个遗漏的整数序列

c++ - 具有 std::vector 和 std::set 属性的容器?

c++ - 替换模板上的虚函数

c++ - 避免模​​板中出现同义反复比较警告

c++ - 函数作为 std::function 包装器的构造函数的参数

c++ - 我们如何预测以下 C++ 程序的输出

c++ - 使用 Cmake 构建 asmJit 示例

c++ - 开始使用 C/C++ 编写游戏的好地方(书籍/教程)?

c++ - log4cxx 的最佳实践是什么?