#include <iostream>
#include <iterator>
#include <typeinfo>
#include <vector>
template <class FwdIt>
void test_func(FwdIt first) {
using FwdIt_vt = typename std::iterator_traits<FwdIt>::value_type;
using Declt_vt = decltype(*first);
std::cout << "iterator_traits: " << typeid(FwdIt_vt).name() << '\n';
std::cout << "decltype: " << typeid(Declt_vt).name() << '\n';
}
int main(int argc, char* args[]) {
std::cout << "std::vector<int>::iterator" << '\n';
std::vector<int> ints;
test_func(ints.begin());
std::cout << '\n';
std::cout << "std::vector<bool>::iterator" << '\n';
std::vector<bool> bools;
test_func(bools.begin());
std::cout << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDxjbGFzcyBGd2RJdD4Kdm9pZCB0ZXN0X2Z1bmMoRndkSXQgZmlyc3QpIHsKICAgIHVzaW5nIEZ3ZEl0X3Z0ID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8RndkSXQ+Ojp2YWx1ZV90eXBlOwogICAgdXNpbmcgRGVjbHRfdnQgPSBkZWNsdHlwZSgqZmlyc3QpOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgIml0ZXJhdG9yX3RyYWl0czogIiA8PCB0eXBlaWQoRndkSXRfdnQpLm5hbWUoKSA8PCAnXG4nOwogICAgc3RkOjpjb3V0IDw8ICJkZWNsdHlwZTogIiA8PCB0eXBlaWQoRGVjbHRfdnQpLm5hbWUoKSA8PCAnXG4nOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJnc1tdKSB7CglzdGQ6OmNvdXQgPDwgInN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIiA8PCAnXG4nOwogICAgc3RkOjp2ZWN0b3I8aW50PiBpbnRzOwogICAgdGVzdF9mdW5jKGludHMuYmVnaW4oKSk7CiAgICBzdGQ6OmNvdXQgPDwgJ1xuJzsKICAgIAogICAgc3RkOjpjb3V0IDw8ICJzdGQ6OnZlY3Rvcjxib29sPjo6aXRlcmF0b3IiIDw8ICdcbic7CiAgICBzdGQ6OnZlY3Rvcjxib29sPiBib29sczsKICAgIHRlc3RfZnVuYyhib29scy5iZWdpbigpKTsKICAgIHN0ZDo6Y291dCA8PCAnXG4nOwp9