gpt4 book ai didi

c++ - 为什么 std::tuple 不能简单复制?

转载 作者:可可西里 更新时间:2023-11-01 15:48:27 24 4
gpt4 key购买 nike

内置 this online compiler ,以下代码:

#include <iostream>
#include <type_traits>
#include <tuple>

int main() {
std::cout << std::is_trivially_copyable<std::tuple<int>>::value << std::endl;
std::cout << std::is_trivially_copyable<std::pair<int, int>>::value << std::endl;

std::cout << std::is_trivial<std::tuple<int>>::value << std::endl;
std::cout << std::is_trivial<std::pair<int, int>>::value << std::endl;
return 0;
}

输出:

0
0
0
0

我在 Visual Studio 2015 中得到了相同的结果。

为什么会这样? POD 类型的 std::tuple,更不用说简单的 std::pair,是否有正当理由不能被简单复制?我假设它们的实现提供了一些自定义赋值运算符,但它们与编译器生成的默认版本有何不同?

最佳答案

就琐碎的可复制性而言, 失败的原因是标准不要求复制/移动赋值运算符是琐碎的。该标准明确声明复制/移动构造函数是默认的,但赋值不是这样。实现也可以默认它们,但标准不要求它。

标准不要求它并没有很好的理由。但事实并非如此。

对于元组,事情要复杂很多。许多 tuple 实现都基于具有正确大小/对齐方式的存储缓冲区,并使用放置 new 来构造该缓冲区中的各个成员。这很好,但是这样的类型必须实现手动复制/移动构造函数,因为它必须调用每种类型的复制/移动构造函数。即使它知道它们都可以轻松复制并通过 memcpy 复制它们,这仍然是手动操作。这使它无法进行微不足道的复制。

现在,有 tuple 的实现,如果类型是平凡可复制的,那么它也可以是平凡可复制的。但是没有要求以这种方式实现它们。如果所有类型都可以简单复制,则要求它们以一种方式实现自己,否则将以不同的方式实现它们,这将使 tuple 实现变得非常复杂。

关于c++ - 为什么 std::tuple<int> 不能简单复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38779985/

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