2009-08-10 7 views
2

このコードをコンパイルしないか、どちらのコンパイラにもバグ(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はではなく、ランタイム値であることを指摘しておきます。メモリは、コンパイル時に静的に割り当てられた変数のために確保されています。

答えて

6

あなたはSTIL、それが実際に使用してしまった場合(この場合は初期化子なし)静的変数の定義のそれぞれで独立し持っている必要があり、使用などのアドレスカウントを取っても形成プログラム的には:

  • C++ 2003規格:9.4.2静的データメンバ段落4(太字添加)

静的データメンバは、CONST 積分またはCONST列挙型、 クラス DEFIに宣言である場合定数初期化子を指定できます。この初期化子は、 の整数定数式(5.19)になります。 この場合、メンバーは の整数定数式に現れることがあります。それは プログラムで使用されている場合 メンバーはまだ 名前空間スコープで定義されなければならないと名前空間スコープ 定義は、それが実行時の値ではありません 初期化子

+2

Visual Studioでは、GCCではなくGCCでそれを取り除くことができて面白いです:( –

+2

未定義の動作の美しさは、あなたが望む結果を得るかもしれないということです。 –

1

実行時の値をテンプレートに渡そうとしていますが、これは不可能です。唯一許可されているテンプレートパラメータは、型(クラス/型名)または整数定数値(int/bool/etc)です。

+2

を含んではなりません。静的変数はコンパイル時に割り当てられます。クラス外のA :: xの定義では、これはうまくコンパイルされます。 –

+0

変数のアドレスは、メモリにロードされるまで知ることができません。 – GManNickG

+0

私が言ったように、この定義がコンパイルされています。 (クラスの静的メンバーのような)外部リンケージを持つものは、リンカー/ローダー(どのステップがシステムに依存するか)によって適切に修正されたアドレスを取得します。グローバルと静的のアドレスを一般的なテンプレートに渡すことでこれを確認することができます。通常はこの特殊なケースでは機能しません。 –

0

興味深いことに、私はVS 2008でうまくコンパイルしました。コンパイル時に 'B'を& xとコンパイルしようとしたときにテンプレートタイプとしてエラーがtypedefから来たと思われましたxのアドレスがどこにあるかを知る。それでも...それはコンパイルし、合理的な出力を与えます。

0

私はこれがとにかくコンパイルされるのを見ているかもしれません。

静的constのアドレスは実際にはランタイム値ではなく、リンク時に完全に解決できます。

+1

アドレスを取らない限り、これらのインライン静的const intは実際には存在しません。そうでなければメモリを占有する理由はまったくありません。 –

関連する問題