2014-03-26 53 views
0

當使用G ++(與鏗鏘++我最後一次檢查),我可以在一個頭寫這篇文章,並期望它的工作:Visual Studio 2013 CTP是否支持非整型類型的類靜態常量初始值設定項?

struct test 
{ 
    static constexpr float MEANING_OF_LIFE = 42.0f; 
}; 

不過的Visual Studio 2013 CTP需要這個(和它編譯沒有警告或錯誤):

struct test 
{ 
    static const float MEANING_OF_LIFE; 
}; 
const float test::MEANING_OF_LIFE = 42.0f; // <- In the header, not a .cpp file. 

這是Visual Studio的缺陷還是我做錯了什麼?

+0

constexpr與const有很大的不同。如果你在g ++/clang中使用「const」,他們不應該允許它。 – heinrichj

回答

3

第二種情況是錯誤的:它需要是

struct test 
{ 
    static const float MEANING_OF_LIFE; 
}; 

const float test::MEANING_OF_LIFE = 42.0f; // In an implementation file 

的實際定義將需要實現(的.cpp)文件中去,而不是在一個頭,否則,你會得到一個違反ODR。

第一種情況是有效的C++ 11,但我想Visual Studio目前還不支持它。 (如果你使用整型而不是float,那麼它可能會工作,因爲在C++ 98中也允許這樣做。)

+0

「實際的定義將需要放入實現(.cpp)文件中,而不是放在標題中」。 **需要**或**應該**?它確實工作,因爲我已經發布了它;編譯時沒有警告或錯誤。 –

+0

@DrTwox如果你只在一個.cpp文件中包含頭文件,你就會擺脫它。但是,如果將它包含在多個.cpp文件中,那麼它將編譯好,但由於重複的'test :: MEANING_OF_LIFE'符號而無法鏈接。 (當然,除非你的'test'類是模板化的,但這是另一回事。) –

相關問題