从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
的扣除指南中的合格名称,何时应通过不合格的查找(与扣除指南相同的范围)?答案 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 ->
。都不允许资格。另一个非限定名称的常见示例是当我们想要引用类(模板)的注入类名时。