我正在编写一个新容器,并试图遵守N3485 23.2.3 [sequence.reqmts]/14
,其中指出:
对于本条和第 21 条中定义的每个序列容器:
如果构造函数
template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
使用不符合输入迭代器条件的类型调用
InputIterator
,则构造函数不应参与重载决议。
(/14
对于采用迭代器范围的成员函数几乎逐字重复)
N3485 23.2.3 [sequence.reqmts]/15
说:
未指定实现确定类型不能作为输入迭代器的程度,但至少整数类型不应作为输入迭代器。
我的理解是“不应参与重载决议”这句话意味着容器实现者应该在模板参数推导期间使用 SFINAE 技巧来禁用该构造函数或成员函数。对于成员函数,这没什么大不了的;因为函数的返回类型是正常的使用方式enable_if
。但是对于构造函数,没有enable_if
可以应用的返回类型。这是我第一次尝试声明构造函数:
// The enable_if use below is to comply with 23.2.3 [sequence.reqmts]/14:
// ... is called with a type InputIterator that does not qualify as an input iterator
// then the constructor shall not participate in overload resolution.
template <typename InputIterator>
path(std::enable_if<!std::is_integral<InputIterator>::value, InputIterator>::type first,
InputIterator last, Allocator const& allocator = allocator_type());
但是,boost 的enable_if
文档建议使用初始化为的虚拟指针参数,nullptr
而不是使用函数的实际参数。这是正确行为所必需的,还是前面path
的迭代器范围构造函数声明可以?