gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:31:02 25 4
gpt4 key购买 nike

我有这个简单的示例 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com