gpt4 book ai didi

c++ - 我可以从 vector 的开头 move 对象吗?为什么不?

转载 作者:行者123 更新时间:2023-11-30 01:01:37 24 4
gpt4 key购买 nike

This不编译。为什么?

#include <iostream>
#include <vector>

struct test_s {
int a;

test_s& operator=(test_s &&ts) {
a = ts.a;
ts.a = 0;
return *this;
}
};

int main ()
{
std::vector<test_s> v;

test_s ss = std::move(v.front());

return 0;
}

错误:

source_file.cpp:20:10: error: call to implicitly-deleted copy constructor of 'test_s'
test_s ss = std::move(v.front());
^ ~~~~~~~~~~~~~~~~~~~~
source_file.cpp:9:13: note: copy constructor is implicitly deleted because 'test_s' has a user-declared move assignment operator
test_s& operator=(test_s &&ts) {
^
1 error generated

是否可以从 vector 中 move 对象(不调用复制赋值运算符)?

最佳答案

This does not compile. Why?

因为您的结构 test_s 需要一个 move 构造函数(或一个复制构造函数)。

声明:

test_s ss = std::move(v.front());

构造对象ss。尽管您看到了 = 符号,但这不是一个作业

但是,您在结构中定义了一个 move 赋值

根据this table ,当用户定义 move 赋值时,编译器不提供 move 构造函数。此外, move 操作应该在拷贝上“回退”,但是(如您在表中所见),复制构造函数 被隐式删除(正如您的编译器所建议的那样) .

Is it possible to move an object from vector(without the call to copy assignment operator)?

嗯,是的。

您应该为您的类定义自己的 move 构造函数。实际上,您应该遵循 rule of five .

注意:还请注意,当您尝试访问 vector 中不存在的元素时,您的代码有一个未定义的行为(正如一些评论所指出的)。

关于c++ - 我可以从 vector 的开头 move 对象吗?为什么不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58802179/

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