如果 T1 和 T2 有,std::p air<T1,T2>不应该有微不足道的默认构造函数吗?

shouldn't std::pair<T1,T2> have trivial default constructor if T1 and T2 have?

本文关键字:T2 T1 微不足道 默认 构造函数 不应该 gt air 如果 lt std      更新时间:2023-10-16

我遇到了一个问题,因为

 std::is_trivially_default_constructible<std::pair<T1,T2>>::value == false;

即使

 std::is_trivially_default_constructible<T1>::value == true;
 std::is_trivially_default_constructible<T2>::value == true;

我没能为这个设计找到一个好的理由。如果T1T2都有=default构造函数,那么std::pair<T1,T2>是否适合使用呢?

是否有简单的解决方法(比定义自己的pair<>更简单)?

原因很简单:历史!最初的std::pair<T0, T1>不能有一个琐碎的默认构造函数,因为它有一些其他构造函数。它被定义为初始化其成员。在std::pair<T0, T1>中,对于人们依赖于初始化值的可构造类型,更改这种行为将是一个突破性的更改。

除了历史原因之外,std::pair<...>的默认构造函数被定义为constexpr构造函数。不能默认constexpr默认构造函数。

我不知道除了创建一个自定义类之外还有什么解决办法。

std::pair值的默认构造函数初始化对的两个元素,第一个和第二个,所以它不可能是琐碎的。