2013-12-12 26 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