Как компилятор выбирает между специализациями шаблонов с массивом? - PullRequest
2 голосов
/ 22 октября 2009

Я только что наткнулся на шаблон std :: tr1 :: экстента, и он озадачил меня. Я никогда не имел дело с параметрами типа массива в моей жизни, поэтому я не понимаю, как они работают. Итак, учитывая код из 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>

как компилятор выбирает между этими специализациями? Какой тип я должен передать extent, чтобы он выбрал второй?

1 Ответ

6 голосов
/ 22 октября 2009
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
...