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