2014-10-27 71 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

相關問題