std :: vector的模板推导指南:其他std类型的限定/非限定名称

时间:2017-09-05 10:03:15

标签: c++ templates stdvector c++17

cppreference:s deduction guides for std::vector开始,提供以下演绎指南:

template< class InputIt,
          class Alloc = std::allocator<typename std::iterator_traits<InputIt>::value_type>>
vector(InputIt, InputIt, Alloc = Alloc())
  -> vector<typename std::iterator_traits<InputIt>::value_type, Alloc>;

其中(也在discussion of the page中提到)vector不包括其名称空间限定符,我在17.10 (temp.deduct.guide)的第1和第3条中解释它:

  

1 ...通过名称查找找不到扣除指南。

     

3 ...演绎指南应在与相应的类模板相同的范围内声明,对于成员类模板,   同样的访问。

我想知道是否使用了合格的名称,例如模板参数化中的std::allocator和simple-template-id中的std::iterator_traits是绝对必要的。从上面3的引用部分来看,不必在namespace std内声明演绎指南,因为vector是?

问题(S)

  • 是否有必要使用上述std::vector的扣除指南中的合格名称,何时应通过不合格的查找(与扣除指南相同的范围)?
  • 如果&#34; no&#34; ,使用合格名称的最重要动机是什么?

1 个答案:

答案 0 :(得分:4)

对于演绎指南,没有特殊的名称查找规则,因此如果不合格的查找会找到名称,则无需使用限定名称。实际上,standard itself中的演绎指南使用了不合格的名称:

namespace std {

  // [...]

  template<class InputIterator,
           class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
    vector(InputIterator, InputIterator, Allocator = Allocator())
      -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>;

  // [...]

}

cppreference的做法是在允许的情况下使用限定名称,但这是一种风格选择,可以提高表现的清晰度,减少歧义,并与我们的链接基础设施很好地配合。

请注意,deduction guides的语法需要(之前的模板名称和之后的 simple-template-id ->。都不允许资格。另一个非限定名称的常见示例是当我们想要引用类(模板)的注入类名时。