编译器如何在具有数组的模板专业化之间进行选择?

发布于 2024-08-08 08:46:48 字数 399 浏览 4 评论 0原文

我刚刚遇到 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 才能让它选择第二个?

I just came across std::tr1::extent template and it puzzled me. I never ever dealt with array type parameters in my life so I don't understand how they work. So, given the code from 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>

how does compiler chooses between those specializations? What type I should pass to extent to get it choose the second one?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等待圉鍢 2024-08-15 08:46:48
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
extent<int[], 0>::value == 0 // second one chosen

int[] is an incomplete type, the compiler doesn't know its sizeof value. The outermost dimension may stay incomplete, because it's not important for the array to function correctly in most contexts (in particular, indexing will still work). Something like int[1][] wouldn't be a correct type anymore.

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

Sure this can be nested:

extent<int[][2], 0>::value == 0 // second one chosen, with `_Tp` being `int[2]`
extent<int[][2], 1>::value == 2 // second one chosen again
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文