Я компилирую следующую простую программу с g++-4.6.1 --std=c++0x
:
#include <algorithm>
struct S
{
static constexpr int X = 10;
};
int main()
{
return std::min(S::X, 0);
};
Я получаю следующую ошибку компоновщика:
/tmp/ccBj7UBt.o: In function `main':
scratch.cpp:(.text+0x17): undefined reference to `S::X'
collect2: ld returned 1 exit status
Я понимаю, что встроенные статические члены неопределили символы, но у меня сложилось впечатление (вероятно, ошибочное), что использование constexpr
приказало компилятору всегда обрабатывать символ как выражение;таким образом, компилятор будет знать, что не разрешено передавать ссылку на символ S::X
(по той же причине вы не можете взять ссылку на литерал 10
).
Однако если Sобъявляется как пространство имен, т. е. «пространство имен S» вместо «struct S», все связывается нормально.
Это ошибка g++
или мне все еще нужно использовать хитрость, чтобы обойти это раздражение?