c++ - 是否可以在 C++03 中定义等效的“移动和交换习语”
问题描述
我绑定到C++03并且我有一个不可复制的对象(例如持有资源)。
我需要使用移动和交换语义来做类似的事情并避免复制:
MyClass returnMyClass(void)
{
MyClass temp;
// fill 'temp' members with actual data
return temp;
}
int main(void)
{
MyClass test;
test = returnMyClass(); // need to avoid copies
}
是否可以在 C++03 中遵守所有这些要求?
this的情况基本相同,但对于 C++03。
换句话说:
给定一个不可复制的类MyClass
,在C++03中是否有可能这样做MyClass test = returnMyClass();
?
恐怕答案是否定的,但也许我错过了一些技巧。
解决方案
移动语义没有魔法。这只是另一个超载。右值引用的东西是一个很好的便利,并不是很重要。
template <class T>
struct rref {
rref (T& t) : t(t) {}
T& t;
};
template<class T>
rref<T> move(const T& t) {
return rref<T>(const_cast<T&>(t));
}
// you now can do a "move ctor"
class Foo {
Foo(rref<Foo>) { ... }
};
现在,您还需要 NRVO 才能使其发挥作用。标准不保证它,但几乎每个实现都提供它。为确保它确实发生,您可以声明但不定义复制 ctor。
推荐阅读
- javascript - 如何使用 OpenLayers 6.5 示例?
- responsive-design - Arrow SVG - 添加额外的线
- python - 获取开始日期和结束日期熊猫列之间的所有日期
- amazon-web-services - 实例的 AWS OpsWorks setup_failed - 无法部署_branch
- c# - 使用嵌套循环,我想将我的数据表填充到另一个数据表中
- python - 通过我的代码运行 GIF 时,如何解决此属性错误?
- php - 如何使用带有 get_the_content() 的 DOMDocument 从 Wordpress 帖子中删除包含某些文本字符串的多个 HTML 标记
- flutter - 拖动介绍网格不同的形状,解决这个问题的最佳方法是什么?
- docker - Docker 上的 Grafana 7.3.0 存在权限问题
- c - C线程的while循环未运行