2014-10-27 64 views
14

我遇到了一个问题,因为不应该std ::对<T1,T2>有简单的默认构造函数,如果T1和T2有?

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构造,如果T1T2有哪些?

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

+0

应该有人[提交出库的问题(https://isocpp.org/std/submit-a-library-issue)。 – edmz 2014-10-27 16:46:49

回答

6

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

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

我不是比创建一个自定义类意识到工作周围的其他的。的std ::对

+0

会使用一个元组修复此问题吗? – 2014-10-27 16:44:29

+0

@NeilKirk:'的std ::元组<...>'有一个非违约'constexpr'默认构造函数(实际,'的std ::对<...>'默认的构造函数也是'constexpr';我不认为'constexpr'构造可以做默认)。也就是说,'std :: tuple <...>'不提供一个简单的默认构造函数。 – 2014-10-27 16:48:10

+0

@ Neil Kirk:默认构造函数constexpr tuple()与std :: pair具有相同的要求:“...效果:值初始化每个元素”(20.4.2.1 n3242),所以它不能做任何事情,因此可以不是微不足道的。 – user396672 2014-10-27 16:59:33

1

默认构造值初始化对两个元件,第一和第二,因此它不能是微不足道的。

+0

是的,我知道。那就是问题所在。 – Walter 2014-10-27 16:58:08

相关问题