std::vector 不支持右值赋值
std::vector do not support rvalue assignment
这是我的测试代码:
void Test::test(const std::vector<uint8_t>& buffer) {
std::vector<uint8_t> data;
data = std::move(buffer);
}
这段代码似乎毫无意义,只是一个例子。 我在 ide 中使用代码导航来找出 = 运算符的实现,我发现处理的 turely 是operator=(const vector<_Tp, _Alloc>& __x)
,它正在执行复制工作。
我搜索了整个文件,没有像operator=(vector<_Tp, _Alloc>&& __x)
这样的功能,那么我如何从移动和右值功能中受益?
我的 c++ 标头在/usr/include/c++/5
中,我检查的文件是vector.tcc
.
它确实支持移动分配,但您试图滥用它。您接受常量引用的buffer
。移动分配需要修改源。您的编译器正试图告诉您这一点。
快速解决方法是通过非常量引用接受。更好的解决方法是已经通过右值引用接受buffer
。这样,当矢量的内容被盗时,调用者注定不会感到惊讶。
更好的解决方法是按值接受。这样,调用方就可以完全控制传递的缓冲区的创建方式。并且您的函数可在更多实例中使用。
相关文章:
- 为什么istream不支持右值提取
- if 子句中的赋值不起作用
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 为什么我的虚函数不赋值?
- 如何重载 const 对象的 [],以便值赋值不会导致编译错误
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 在声明上为类赋值不会编译
- std::vector 不支持右值赋值
- 常量引用向量向量<向量<long>>赋值不编译
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- C++ int 赋值不起作用
- 为什么函数头的更改会导致指针赋值不起作用
- 标准库中自赋值不安全的move赋值操作符的基本原理是什么?
- 对指向std::list类型的共享指针赋值不起作用
- Xcode 赋值到强制转换是非法的,不支持左值转换
- 为什么在这种情况下不调用赋值运算符以支持复制构造函数
- 为什么函数中变量的最后一个赋值不能被视为移动?
- 为什么赋值不会使对象指向相同的位置