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