如果T1和T2有?</t1,t2>,那么std :: pair <t1,t2>是否有普通的默认构造函数?

时间:2014-10-27 16:14:38

标签: c++ c++11 language-lawyer default-constructor

我遇到了问题,因为

 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;

我没有找到这个设计的充分理由。如果std::pair<T1,T2>=default拥有T1构造函数,那么T2不适合吗?

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

2 个答案:

答案 0 :(得分:7)

原因很简单:历史!原始std::pair<T0, T1>无法拥有一个简单的默认构造函数,因为它有一些其他构造函数。它被定义为初始化其成员。在std::pair<T0, T1>中为人们依赖于初始化值的简单可构造类型更改此行为将是一个重大变化。

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

我不知道除了创建自定义类之外的解决方法。

答案 1 :(得分:1)

std :: pair的默认构造函数value-初始化该对的两个元素,第一个和第二个,因此它不可能是微不足道的。