※便宜上構造体(struct)もクラスと書いています
※使用したコンパイラはVC9/gcc4.3.2です
クラス内にconst変数があり、クラス内でのテンプレートクラス宣言の引数で同じ名前を使ったプログラムをVCとgccでコンパイル・実行した場合に挙動が変わります。
#include <iostream>
using namespace std;
struct test
{
const static int value = 1;
template<int value> struct inner1 {
const static int inner_value = value;
int get_value() { return value; }
};
};
int main()
{
test::inner1<2> t1;
cout << t1.inner_value << endl;
cout << t1.get_value() << endl;
}
VCでの実行結果は
2
2
gccの実行結果は
2
1
VCの場合inner1の中でのvalueは常にテンプレート引数のvalueが使用されていますが、gccの場合静的変数の初期値valueはテンプレート引数が使われているのにクラス内メソッドget_valueの戻り値のvalueで外側のクラスtestの静的変数が使われています。
どちらの挙動が正しいのかは知りませんが、僕はVCの方が正しいような気がしています。