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>

编译器如何在这些专业之间进行选择?我应该通过什么类型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 回答