次の構文は何を意味しますか?C++バリデーションテンプレートの珍しい例
#include <iostream>
template <int ...> struct s;
int main() {
int i = s<,>::xxx;
std::cout << i << std::endl;
}
これはGCC 4.4.5+ときに実行出力0
によってコンパイルされます。
次の構文は何を意味しますか?C++バリデーションテンプレートの珍しい例
#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;
}
と-S
-switchでそれをコンパイルし、私は次のようにクリーンアップアセンブリ出力を得るために:今すぐ
main:
pushq %rbp
movq %rsp, %rbp
movl -4(%rbp), %eax
popq %rbp
ret
を、私のasm少し錆びていますが、唯一の重要なコードはmovl -4(%rbp), %eax
のようです。戻り値はi
から読み取れるものに設定されています。言い換えれば、プログラムは、単にmain
関数が入力されたときにスタックの上にあったものを返します。これは、@ jrokのコメントの初期化がどうにかして無視されていることを裏付けるようです。神秘的なコードs<,>::xxx
-expressionのコードは生成されていません。
ボトムライン;これはコンパイラのバグのようです。コンパイラはエラーメッセージを表示する必要があります。
裏付け注:私はプログラムint main() { int i; return i; }
に対して同じアセンブリ出力を得ています。
ニース控除。 :) – Dennis
私のマシンにいくつかランダムな値を出力します。 'i'の初期化は何とか無視され、' i'の単位化された値が出力されます。 – jrok
これは合法的に見えません。 's'は定義されておらず(' xxx'メンバも含まれていません)、テンプレートに空でないパラメータを与えなければなりません。 (私はgcc 4.6.2でコンパイルし、 '32767'を出力して、clangはコンパイルしません)。 – Mankarse
's'や' xxx'の名前を変更しても振る舞いは変わりません。これはほぼ確実にgccのバグです。 varadicテンプレートに空の引数を指定すると、バグが引き起こされるようです。 – Mankarse