【问题标题】:How does std::remove_const<T> work internallystd::remove_const<T> 如何在内部工作
【发布时间】:2017-09-27 19:15:47
【问题描述】:

案例 1 std::remove_const 的可能实现是

template< class T > struct remove_const          { typedef T type; };
template< class T > struct remove_const<const T> { typedef T type; };

当我使用它们时

std::remove_const<int> // use the first version
std::remove_const<const int> // use the second version

案例 2 如果我评论第二个版本

template< class T > struct remove_const          { typedef T type; };
//template< class T > struct remove_const<const T> { typedef T type; };

并使用它们

std::remove_const<int> // use the first version
std::remove_const<const int> // use the first version

在案例 1 中,编译器如何决定为 const int 选择第二个版本?

【问题讨论】:

  • 我想你是在问部分模板专业化是如何工作的。这很复杂,但这个 wiki 是一个不错的概述:en.cppreference.com/w/cpp/language/partial_specialization。简短的回答是 const intconst T 的匹配度比 plain-old-T 更接近,所以它是首选。
  • @TravisGockel 感谢您的链接。我已阅读有关模板专业化的信息。但是我看到的示例,对完全不同的类型(例如 int、float、short)使用专门化,但不使用密切相关的类型(例如 int 和 const int)。感谢您的信息
  • 当然是有标准的。确切地说,是一个 ISO 标准。虽然官方出版物是专有的,但出版前的最后草稿是向公众提供的(并且几乎与完成的文件相同)。
  • 在相关说明中,您不应该在代码中真正使用remove_const。 100 次中有 99 次,如果你是,那么你可能做错了什么。

标签: c++ std typetraits


【解决方案1】:

专业化。

const T 版本比泛型版本更专业(因为如果类型匹配 const T,则也匹配泛型 Tint 匹配 T 但不匹配 const T)。

规则是,如果一个类型匹配两个或多个版本,编译器必须选择更专业的一个。

【讨论】:

    【解决方案2】:

    不是模板的两个不同版本。这是一个单独的模板(你称之为第一个版本),定义了一个专业化(你称之为第二个版本)。

    因此,当您使用模板时,它总是首先查找模板的定义,然后查找与您正在使用的类型签名匹配的模板的预先存在的特化和实例化。如果它找到匹配的特化(或实例化),它会使用它。只有在没有现有的特化或实例化的情况下,它才会实例化模板。

    所以当你说remove_const&lt;int&gt; 它匹配模板,但不匹配特化,所以它实例化模板。 remove_const&lt;const int&gt;匹配模板也匹配特化,所以使用特化(也是模板,所以需要实例化,但那是次要的)。

    使您的“第二个版本”成为专业化而不是新模板的原因是名称 remove_const 后面的 &lt;..&gt; 列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2010-10-14
      • 2013-09-28
      • 2012-08-01
      相关资源
      最近更新 更多