我有一个模板函数,需要专门用于迭代器。所以我所做的就是:
template <typename T>
void function2(T whatever, typename std::iterator_traits<T>::pointer) // ... iterator
template <typename T>
void function2(T whatever, ...) // ... non-iterator
template <typename T>
void function(T whatever) {
function2(whatever, NULL);
}
而且我碰壁了,因为 Microsoft 标准库专门std::iterator_traits
用于所有数字类型(bool
, char
, int
, float
...)。并且它是这样做的reference
并且pointer
是非void
的,尽管事实上在这些类型上既不能调用operator*
也不能调用。operator->
好的,我可以以一些更复杂的模板机制为代价检查std::iterator_traits<T>::category
派生std::input_iterator
(实际上我认为std::forward_iterator
在我的情况下更合适)。
但是,我有兴趣知道:
- 为什么他们
iterator_traits
为不符合迭代器概念的类型定义(即使输出迭代器至少需要一元operator*
,这些类型都没有。 - 他们这样做是否违反了 C++ 规范?并不是说微软不会在所有地方都违反它,但如果他们是,我会对特定于编译器的解决方法感到满意,如果他们显然不这样做的话。
- 无论如何,它甚至可以正常工作吗?似乎
std::iterator_traits<T>::pointer
总是存在,但未定义并导致错误而不是 SFINAE。