0

以下代码无法与 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'

如果我注释掉地图,事情链接就好了。这是一个编译器错误,还是我在标准中遗漏了一些极端情况?

4

1 回答 1

7

您忘记定义静态成员。

一旦您使用它,就需要一个完整的定义。是的,即使它有一个内联初始化程序,是的,即使它被标记为constexpr.

添加:

constexpr int Foo::foo;

您的原始代码通过ideone.comColiru在 GCC 4.8.1 中为我工作,但这是在优化打开的情况下(因此在每种情况下,常量都可能被符号取代)。关闭优化后,错误是可重现的

于 2013-12-12T18:06:02.867 回答