次の構造はどういう意味ですか?
#include <iostream>
template <int ...> struct s;
int main() {
int i = s<,>::xxx;
std::cout << i << std::endl;
}
これは gcc 4.4.5+ によってコンパイルされ、実行時に出力されます0
。
プログラムを次のように書き直しました。
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; }
。