代码之家  ›  专栏  ›  技术社区  ›  vava

编译器如何在以数组为特征的模板专门化之间进行选择?

  •  2
  • vava  · 技术社区  · 15 年前

    我刚刚遇到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 要得到它,选择第二个?

    1 回复  |  直到 15 年前
        1
  •  6
  •   Johannes Schaub - litb    15 年前
    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