私はこれらのコード行に出くわした:負の配列インデックスと一見冗長なテンプレートの使用
template< int I > struct arg
{
arg()
{
}
template< class T > arg(T const & /* t */)
{
// static assert I == is_placeholder<T>::value
typedef char T_must_be_placeholder[ I == is_placeholder<T>::value? 1: -1 ];
}
};
template< class T > struct is_placeholder
{
enum _vt { value = 0 };
};
型名T
はどこにも内部に使用されていない間、構造体is_placeholder
がテンプレート化された理由は何ができますか?
なぜT_must_be_placeholder
が無効なサイズ-1
を持つように定義されているのですか?これを実現するために、私はarg<1>(1)
と呼ばれ、error: size of array is negative
を期待通りに与えました。それはある種のサニティチェックテクニックですか? arg<1>(1)
呼び出しが行われないと、コンパイラはこの問題を報告しないのはなぜですか?
int i = 0;
char a[i == 1 ? 1 : -1]; //No error
健全性チェックは、第一例のために働く場合
が、その後、どのようにそれは、第1のために失敗するのですか?
これは、static_assertの貧弱な実装です。条件が満たされない場合、負のサイズの配列が宣言され、コンパイルエラーが発生します。 –
最後の例は、配列のサイズが定数式ではないため、コンパイルしないでください。おそらく、GCCの拡張機能のために、負のサイズを渡すとどうなるかわからないでしょう。 – sbabbi
驚いたことに、これはhttp://ideone.com/LrWvHhをコンパイルします。チェックアウト。 –