Выражения класса constexpr в списках инициализаторов

Следующий код не может связаться с 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'

Если я закомментирую карту, все будет просто замечательно. Это ошибка компилятора, или это какой-то угловой случай, который мне не хватает в стандарте?

1 ответ

Решение

Вы забыли определить статический член.

Как только вы используете его, требуется полное определение. Да, хотя он имеет встроенный инициализатор и, да, хотя он помечен constexpr,

Добавлять:

constexpr int Foo::foo;

Ваш оригинальный код работает для меня в GCC 4.8.1 через http://ideone.com/bfnzYG и Coliru, но это с включенными оптимизациями (так что константа, вероятно, будет заменена для символа в каждом случае). При отключенных оптимизациях ошибка воспроизводима.

Другие вопросы по тегам