【发布时间】:2013-07-05 22:50:40
【问题描述】:
假设我有一个只有一个构造函数的类:
class T {
public:
T(BigClass&& big) : big(std::move(big)) {}
...
SomeBigClass
};
在大多数情况下,构造函数是在临时对象上调用的,但在一个地方我需要创建 BigClass 的显式副本,因为它不是临时对象,并且会在循环中多次使用:
void foo(const BigClass& big) {
while (...) {
T t(std::make_a_copy(big));
...
}
}
在 C++11 或 C++14 中是否有任何与 std::move“对偶”的函数可以替换上面的 make_a_copy ?
编辑:一些说明。
【问题讨论】:
-
如果您可能需要进行复制,那么您不应该也提供一个
T(BigClass const & big)构造函数然后调用它吗? -
为什么需要复制一个临时的,而不是一个move?这似乎有点荒谬。
-
有人可能会拒绝我的编辑。
-
如果你想写尽可能少的函数,两个“核心”是复制构造函数和
swap。移动构造函数、复制赋值和移动赋值可以写成复制构造函数和交换。没有复制构造函数……没有捷径。 -
这个问题与标题所说的完全无关。在你有一个右值引用表达式并且你需要一个 modifiable 左值引用(如果你这样写它不会绑定,并创建右值的临时值也不起作用,因为它只能初始化
const左值引用)。情况并非如此,您的情况正好相反;可以使用std::move进行编译,但这并不符合您的要求。解决方法是先复制big的值,和你的class T无关。
标签: c++ c++11 move-semantics