2015-11-24 111 views
1

的大小靜態斷言我試圖把一個靜態斷言靜態常量unordered_map成員的大小。但是,我得到一個錯誤,說靜態斷言的非const條件。有人可以幫忙嗎?靜態常量成員

#include<unordered_map> 
#include<string> 

using namespace std;  

class A{ 
    public: 
    static const unordered_map<string,string> strMap; 
}; 

const unordered_map<string,string> A::strMap ={{"key","value"}}; 

int main() { 
static_assert(A::strMap.size() == 1, "sizes don't match"); 
} 

編輯:根據意見,我想澄清一下,下面的代碼工作正常(它使用一個數組而不是地圖):

#include<unordered_map> 
#include<string> 

using namespace std;  

class A{ 
    public: 
    static const pair<string,string> strMap[]; 
}; 

const pair<string,string> A::strMap[] ={{"key","value"}}; 

int main() { 
//static_assert(sizeof(A::strMap)/sizeof(A::strMap[0]) == 2, "sizes don't match"); Fails to compile 
static_assert(sizeof(A::strMap)/sizeof(A::strMap[0]) == 1, "sizes don't match"); //Compiles fine 
} 

回答

3

無法做到這一點。你需要constexpr的std :: unordered_map了這一點,這是不可能的,因爲它的構造不constexpr。當然,沒有類分配內存(unordered_map存在這樣的),可以宣佈它的構造constexpr。

+0

爲什麼可能的陣列,而不是地圖?據我所知,arrarys沒有構造函數,但我可以用一對<字符串,字符串>的陣列,並且它會工作過.. – SPMP

+0

因爲既不陣列,也不對分配內存 - 所以它們的構造可以被宣佈'constexpr '。顯然,內置數組本身沒有構造函數 - 但它們仍然隱含地表現爲constexpr。 – SergeyA

+0

@ user2308211你可以有constexpr陣列和雙,但他們不能包含'的std :: string'。所以一對的數組將不起作用。 – interjay