c++ - 显式选择复制分配
问题描述
在 C++11 中,如果复制和移动赋值都可用,如果参数是左值,编译器会自动选择复制赋值,如果是右值,编译器会自动选择移动赋值。使用std::move
它可以显式地选择左值的移动分配。但是怎么可能明确地选择右值的复制分配呢?
代码示例:
#include <iostream>
class testClass
{
public:
testClass &operator=(const int &other) {
std::cout << "Copy assignment chosen." << std::endl;
return *this;
}
testClass &operator=(int &&other) {
std::cout << "Move assignment chosen." << std::endl;
return *this;
}
};
int main(int argc, char *argv[])
{
int a = 4;
testClass test;
test = a; // Selects copy assignment
test = 3; // Selects move assignment
test = std::move(a); // Selects move assignment
// test = std::copy(3); // <--- This does not work
return 0;
}
解决方案
一种可能的方法是编写自己copy
的将对象绑定到左值引用:
template <class T>
constexpr T& copy(T&& t) noexcept
{
return t;
}
你可以这样测试它:
test = copy(a);
test = copy(3);
test = copy(std::move(a));
你可以把这个函数放在你自己的命名空间中以保持干净。您也可以为它选择一个更好的名称。
为了解决对终身问题的恐惧,这里有一些注意事项:
- 此
copy
函数接受一个引用并立即返回相同的引用。这意味着调用者负责控制生命周期。 - 临时对象的生命周期一直持续到语句结束。这使得对象持续足够长的时间以传递到
=
.
推荐阅读
- homebrew - 如果它是补丁或其他非标准文件名,我如何从本地文件中提取?
- solidity - 不懂编译器
- flutter - 颤动屏幕从底部溢出并且不滚动
- python - 为什么我在 Mysql SELECT 查询期间收到此 UnicodeDecodeError?
- javascript - 如何在SVG中动态查找父元素内的文本元素?
- python - 选项卡完成以显示可用的动态创建的关联对象
- javascript - 函数在获取请求完成之前返回
- r - 有没有 [r] 符号的字典?
- mysql - 带有springboot和MySql数据库的实时flutter聊天应用
- java - 多部分文件上传:415 不支持的媒体类型