移动类的成员作为常量引用参数传递
Moving members of class passed as a const reference argument
正在考虑:
template <typename... Args>
ResourceHolder& operator+=(const ResourceInserter<Key, Args...>& inserter) {
if constexpr (sizeof...(Args) == 0) {
insert(std::move(inserter.key),
std::move(inserter.fileName));
} else {
insert(std::move(inserter.key),
std::move(inserter.fileName),
std::move(std::get<Args...>(inserter.tuple)));
}
return *this;
}
你认为这是移动语义的正确用法吗?
ResourceInserter
inserter
实例作为常量引用传递。
移动 const 对象通常是一个简单的副本(除非你重载Object(const Object&&)
(,所以你对std::move
的使用似乎毫无用处。
如果ResourceInserter
的成员是(非常量(引用, 你的const ResourceInserter&
是"误导性的",你的举动实际上会发生。
No.
你正在投射到const Key &&
等。Key::Key(const Key&&)
通常不能做任何有用的事情,所以你会复制。
您可能希望有一对重载
template <typename... Args>
ResourceHolder& operator+=(const ResourceInserter<Key, Args...>& inserter) {
if constexpr (sizeof...(Args) == 0) {
insert(inserter.key,
inserter.fileName);
} else {
insert(inserter.key,
inserter.fileName,
std::get<Args...>(inserter.tuple));
}
return *this;
}
template <typename... Args>
ResourceHolder& operator+=(ResourceInserter<Key, Args...>&& inserter) {
if constexpr (sizeof...(Args) == 0) {
insert(std::move(inserter.key),
std::move(inserter.fileName));
} else {
insert(std::move(inserter.key),
std::move(inserter.fileName),
std::move(std::get<Args...>(inserter.tuple)));
}
return *this;
}
从右值inserter
的成员移动的位置
与它的名字相反,std::move实际上并没有移动任何东西。它只是告诉编译器尝试移动(即,指示对象t
可以通过将其转换为右值引用类型[更具体地说,通过生成xvalue表达式]来"移动"(。
但是,您的类没有接受const inserter&&
的构造函数,它将使用类的复制构造函数(隐式或显式(,并安全地复制。 没有危险,没有陷阱。如果由于任何原因禁用复制构造函数,则会收到编译错误。
试试这个:
#include <iostream>
struct Test {
Test() { }
Test(const Test& ) { std::cout << "COPY" << std::endl; }
Test(Test&&) { std::cout << "MOVE" << std::endl; }
};
int main()
{
const Test t;
Test t2 = std::move(t);
return 0;
}
打印COPY
,而不是MOVE
。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?