2013-12-12 28 views
0

下面的代碼失敗,G ++ 4.8.2鏈接:類constexpr表達

#include <map> 

struct Foo 
{ 
    constexpr static int foo = 1; 
}; 

static std::map<int, int> map {{1, Foo::foo}}; 

int main() 
{ 
    return Foo::foo; 
} 

我得到以下錯誤:

g++ -std=c++11 -o foo foo.cc 
/tmp/ccZXCwiK.o: In function `__static_initialization_and_destruction_0(int, int)': 
foo.cc:(.text+0x51): undefined reference to `Foo::foo' 

如果我註釋掉地圖,事情鏈接正好。這是一個編譯器錯誤,還是在標準中我缺少一些特殊情況?

+0

@LightnessRacesinOrbit http://coliru.stacked-crooked.com/a/d9da4dacc301287d –

+0

@ JohannesSchaub-litb:感謝 –

+0

再次,一個'+'神奇修復的東西:'靜態的std ::地圖地圖{{1 ,+ Foo :: foo}};'工作正常。 – dyp

回答

7

您忘了定義的靜態成員。

只要你odr-use它,需要一個完整的定義。是的,儘管它有一個內聯初始化程序,並且,即使它標記爲constexpr

地址:

constexpr int Foo::foo; 

您的原始代碼同時通過ideone.comColiru對我的作品在GCC 4.8.1,但是這與最佳化開啓(使在每種情況下,常數可能被替代爲符號)。優化關閉,the error is reproducible

+0

有趣。這出現在我用constexpr替換宏的一個例子中。弄清楚臭氧使用的地方肯定會讓我滑倒。 – md5i