以下代码无法与g ++ 4.8.2链接:

#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'


如果我注释掉地图,一切都很好。这是一个编译器错误,还是我在标准中缺少的一些特殊情况?

最佳答案

您忘记定义静态成员。

一旦您使用它,就需要完整的定义。是的,即使它具有内联初始化程序,也可以,即使它已标记为constexpr

加:

constexpr int Foo::foo;



example


您的原始代码通过ideone.comColiru在GCC 4.8.1中为我工作,但是启用了优化(因此在每种情况下都可能用常量代替符号)。关闭优化后,the error is reproducible

关于c++ - 初始化列表中的constexpr类表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20550862/

10-11 22:48
查看更多