2

std::tr1::extent テンプレートに出くわしたばかりで、戸惑いました。人生で配列型パラメーターを扱ったことがないので、それらがどのように機能するかわかりません。だから、gccからのコードを考えるとtype_traits

template<typename _Tp, unsigned _Uint, std::size_t _Size>
     struct extent<_Tp[_Size], _Uint>

template<typename _Tp, unsigned _Uint>
     struct extent<_Tp[], _Uint>

コンパイラはこれらの特殊化をどのように選択しますか? 2番目のタイプを選択するには、どのタイプに渡す必要がextentありますか?

4

1 に答える 1

6
extent<int[], 0>::value == 0 // second one chosen

int[]sizeofは不完全な型であり、コンパイラはその値を知りません。ほとんどのコンテキストで配列が正しく機能することは重要ではないため、最も外側の次元は不完全なままになる可能性があります (特に、インデックス付けは引き続き機能します)。のようなものint[1][]は、もはや正しいタイプではありません。

extent<int[2], 0>::value == 2 // first one chosen

確かにこれはネストできます:

extent<int[][2], 0>::value == 0 // second one chosen, with `_Tp` being `int[2]`
extent<int[][2], 1>::value == 2 // second one chosen again
于 2009-10-22T10:33:45.067 に答える