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

Wal*_*ter 14 c++ default-constructor language-lawyer c++11

我遇到了一个问题,因为

 std::is_trivially_default_constructible<std::pair<T1,T2>>::value == false;
Run Code Online (Sandbox Code Playgroud)

即使

 std::is_trivially_default_constructible<T1>::value == true;
 std::is_trivially_default_constructible<T2>::value == true;
Run Code Online (Sandbox Code Playgroud)

我没有找到这个设计的充分理由.如果有的话,拥有std::pair<T1,T2>一个=default构造函数是不合适的?T1T2

有一个简单的工作(比定义我自己更简单pair<>)?

Die*_*ühl 7

原因很简单:历史!原来std::pair<T0, T1>没有一个普通的默认构造函数,因为它有一些其他的构造函数.它被定义为初始化其成员.std::pair<T0, T1>对于人们依赖于初始化值的简单可构造类型,改变这种行为将是一个突破性的变化.

除了历史原因,默认构造函数std::pair<...>被定义为constexpr构造函数.一个constexpr默认的构造函数,不能拖欠.

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

  • "constexpr默认构造函数不能默认." 有点过于简单了.如果`T`的所有非静态数据成员都有`constexpr`默认构造函数,那么`T`的默认默认构造函数可以是`constexpr`.实际上,如果隐含地定义它*将是每个12.1/6的'constexpr`. (7认同)