このコードをコンパイルしないか、どちらのコンパイラにもバグ(GCC 4.2とSun Studio 12)があるかどうかを判断するのは難しいです。一般に、ヘッダーファイルで宣言した静的なクラスメンバーを持っている場合は、それをいくつかのソースファイルで定義する必要があります。ただし、静的定数積分の標準では例外があります。例えば、これは許可されています静的const intのアドレスを定義なしでテンプレートに渡すことは正当なものですか?
#include <iostream>
struct A {
static const int x = 42;
};
クラス本体のどこか外のxの定義を追加する必要はありませんで。私も同じことをしようとしていますが、私はxのアドレスを取ってテンプレートに渡します。この結果、リンカエラーは定義の欠如について不平を言う。以下の例では、リンクしません(の定義を逃し:: x)は、それは同じソースファイル内のすべてだ場合でも:それは限り、私はアドレスを渡さないように動作するので
#include <iostream>
template<const int* y>
struct B {
static void foo() { std::cout << "y: " << y << std::endl; }
};
struct A {
static const int x = 42;
typedef B<&x> fooness;
};
int main()
{
std::cout << A::x << std::endl;
A::fooness::foo();
}
奇妙ですテンプレートに。これはバグですか、何らかの形で技術標準に準拠していますか?
編集:私は、& A :: xはではなく、ランタイム値であることを指摘しておきます。メモリは、コンパイル時に静的に割り当てられた変数のために確保されています。
Visual Studioでは、GCCではなくGCCでそれを取り除くことができて面白いです:( –
未定義の動作の美しさは、あなたが望む結果を得るかもしれないということです。 –