【发布时间】:2020-02-19 09:14:20
【问题描述】:
我绑定到 C++03 并且我有一个不可复制的对象(例如持有资源)。
我需要使用 move-and-swap 语义来做类似的事情并避免复制:
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();?
恐怕答案很简单否,但也许我错过了一些技巧。
【问题讨论】:
-
不清楚为什么你不使用构造函数而不是
makeClass -
如果您的意思是“如果类不可复制,您能否使用语法
return test从函数返回test,这是一个自动存储持续时间的变量?”答案是不。在 C++03 中,该 return 语句隐式调用复制构造函数,如果编译器检测到它无法调用该构造函数,则需要诊断错误。main()中的test()的定义还需要一个可访问的复制构造函数。即使编译器省略了临时变量也是如此——C++03 编译器不需要这样做。 -
将您的复制构造函数设为私有。编写一个自定义的
move()函数并转移底层元素的所有权。 -
MyClass test = makeClass() 在您的示例中是初始化。没有副本。
-
@Peter 这正是我想问的,我编辑了示例代码以消除歧义并澄清问题。我不是要使用方法而不是构造函数,也不是要初始化。