2014-09-05 54 views
18

今天之間的區別,我偶然發現std::vectorthese standard declarations構造函數:構造函數:違約和委託參數

// until C++14 
explicit vector(const Allocator& alloc = Allocator()); 
// since C++14 
vector() : vector(Allocator()) {} 
explicit vector(const Allocator& alloc); 

這種變化可以在大多數標準集裝箱中可以看出。稍微不同的是爲例std::set

// until C++14 
explicit set(const Compare& comp = Compare(), 
       const Allocator& alloc = Allocator()); 
// since C++14 
set() : set(Compare()) {} 
explicit set(const Compare& comp, 
       const Allocator& alloc = Allocator()); 

兩者有什麼模式,什麼是他們的(DIS)的優勢有什麼區別?
它們是否嚴格等價 - 編譯器是否生成類似於第一個的東西?

+1

你說「STL」容器。你的意思是這些標準庫容器成員函數的標識是由標準本身或者某些特定實現的代碼所規定的嗎? – 2014-09-05 22:34:26

+0

@LightnessRacesinOrbit我的意思是前者:我假設這些函數的簽名是標準的(en.cppreference.com表示有一個來自標準的改變 - 「自C++ 14以來」)。 – Nelfeal 2014-09-05 22:45:21

+0

@LightnessRacesinOrbit我真的不明白要編輯什麼;是「STL」錯誤?對我來說,它是標準庫的一部分,它使用模板(因此標準的「模板」庫)。或者是別的什麼 ? – Nelfeal 2014-09-06 08:11:05

回答

18

不同的是,

explicit vector(const Allocator& alloc = Allocator()); 

是即使在使用默認參數的情況下explicit,而

vector() : vector(Allocator()) {} 

不是。 (在第一種情況下的explicit需要防止Allocator期從被隱式轉換爲一個vector

這意味着你可以寫

std::vector<int> f() { return {}; } 

std::vector<int> vec = {}; 

在第二但不是第一個。

參見LWG issue 2193

+0

如果顯式關鍵字被刪除,我認爲分配器可以隱式轉換爲向量? – Nelfeal 2014-09-05 22:34:09

+0

@Nelxiost正確,我們也不想要。 – 2014-09-05 22:34:27

+3

哦,這比我在閱讀這個問題時所期望的更有趣。 – 2014-09-05 22:35:10