gpt4 book ai didi

c++ - 为什么在元组初始化中复制构造的对象?

转载 作者:行者123 更新时间:2023-11-28 05:11:16 25 4
gpt4 key购买 nike

我有一种情况无法解决。我定义了一个不可复制的结构,并想在一个元组中就地构造它。如果我这样做,它就会被复制。我认为问题可能出在 std::make_tuple 上,但事实并非如此。

如果我改为构建对象,然后将其 move 到元组中,一切都会按预期进行。

演示(我使用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;
}

输出

Constructed in-place.

Destroyed

Other tests.

Destroyed

Moved.

知道这是为什么吗?我对右值的理解是基本的,所以我猜我遗漏了一些明显的东西。谢谢。

最佳答案

它不是复制的,它仍然是 move 的。

在您的情况下,您正在创建一个临时的 (MoveMe{10}),然后使用它在元组中 move 构造 MoveMe 的实例。在元组中的 MoveMe 实例被 move 构造后,被 move 的临时对象被销毁。

可以通过传递参数直接在元组中构造MoveMe对象

std::cout << "Directly Constructed" << std::endl;
auto tuple = std::tuple<MoveMe>(10);

这不会导致临时创建然后销毁。

关于c++ - 为什么在元组初始化中复制构造的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43458191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com