デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  268  : 記事  0  : コメント  4419  : トラックバック  79

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

2009年6月8日 #

※便宜上構造体(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の方が正しいような気がしています。

posted @ 0:43 | Feedback (3)