2012-05-30 4 views
12

次の構文は何を意味しますか?C++バリデーションテンプレートの珍しい例

#include <iostream> 

template <int ...> struct s; 

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

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

これはGCC 4.4.5+ときに実行出力0によってコンパイルされます。

+0

私のマシンにいくつかランダムな値を出力します。 'i'の初期化は何とか無視され、' i'の単位化された値が出力されます。 – jrok

+5

これは合法的に見えません。 's'は定義されておらず(' xxx'メンバも含まれていません)、テンプレートに空でないパラメータを与えなければなりません。 (私はgcc 4.6.2でコンパイルし、 '32767'を出力して、clangはコンパイルしません)。 – Mankarse

+0

's'や' xxx'の名前を変更しても振る舞いは変わりません。これはほぼ確実にgccのバグです。 varadicテンプレートに空の引数を指定すると、バグが引き起こされるようです。 – Mankarse

答えて

13

私はこれにプログラムを書き直し:

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; }に対して同じアセンブリ出力を得ています。

+0

ニース控除。 :) – Dennis

関連する問題