12

次の構造はどういう意味ですか?

#include <iostream>

template <int ...> struct s;

int main() {
    int i = s<,>::xxx;

    std::cout << i << std::endl;
}

これは gcc 4.4.5+ によってコンパイルされ、実行時に出力されます0

4

1 に答える 1

13

プログラムを次のように書き直しました。

template <int ...> struct s;

int main() {
    int i = s<,>::xxx;

    return i;
}

-switchを使用してコンパイルし-S、次のようにクリーンアップしたアセンブリ出力を取得します。

main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    -4(%rbp), %eax
        popq    %rbp
        ret

さて、私の asm は少し錆びていますが、唯一の重要なコードは、movl -4(%rbp), %eaxから読み取ることができるものに戻り値を設定するようiです。mainつまり、プログラムは、関数に入ったときにスタックの一番上にあったものを返すだけです。iこれは、の初期化が何らかの形で無視されるという@jrokのコメントを裏付けているようです。mystical s<,>::xxx-expression のコードは生成されていません。

要点; これはコンパイラのバグのようです。コンパイラは、エラー メッセージを表示する必要があります。

補足補足: program に対して同一のアセンブリ出力が得られますint main() { int i; return i; }

于 2012-05-30T11:07:42.650 に答える