次の単純なプログラムをコンパイルしています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」ではなく「名前空間 S」である場合、すべて正常にリンクされます。
これはg++バグですか、それともこの煩わしさを回避するためにトリックを使用する必要がありますか?