【发布时间】:2017-04-17 19:26:41
【问题描述】:
我有一种情况,我无法解决。我定义了一个不可复制的结构,并希望在一个元组中就地构造它。如果我这样做,它就会被复制。我以为问题可能出在std::make_tuple,但事实并非如此。
如果我构造对象,然后在元组中移动它,事情就会按预期工作。
演示(我使用std::exit来防止正常破坏的输出)。
#include <tuple>
#include <iostream>
#include <cstdlib>
struct MoveMe {
MoveMe(size_t s) : size(s) {}
MoveMe(MoveMe&&) = default;
MoveMe(const MoveMe&) = delete;
MoveMe& operator=(MoveMe&&) = default;
MoveMe& operator=(const MoveMe&) = delete;
~MoveMe() {
std::cout << "Destroyed" << std::endl;
}
size_t size = 0;
};
int main(int, char**) {
std::cout << "Constructed in-place." << std::endl;
auto tuple = std::make_tuple(MoveMe{10});
std::cout << std::endl << "Other tests." << std::endl;
std::tuple<MoveMe> tuple2 = std::tuple<MoveMe>(MoveMe{10});
std::cout << std::endl << "Moved." << std::endl;
MoveMe obj{10};
auto tuple3 = std::make_tuple(std::move(obj));
std::exit(0);
// return 0;
}
输出
就地建造。
销毁
其他测试。
销毁
搬家了。
有什么想法吗?我对右值的理解是基本的,所以我的猜测是我遗漏了一些明显的东西。谢谢。
【问题讨论】:
-
被复制是什么意思?
-
调用了析构函数,所以它被复制到元组中。没有?
-
您似乎对
~MoveMe()的调用感到困惑。当有移动操作时,被移动的变量仍然存在,它仍然必须被销毁;它可能仍包含一些其他必须正确发布的数据。您正在创建一个临时的并从中移动。在表达式完成并将其内容移入元组后,该临时对象将立即被销毁。
标签: c++ copy tuples move rvalue