    #include <type_traits>
    #include <iterator>
    #include <vector>

    template<typename T, typename = void>
    struct is_const_iterator : std::false_type { };

    template<typename T>
    struct is_const_iterator<T,
        typename std::enable_if<
            std::is_const<
                typename std::remove_pointer<
                    typename std::iterator_traits<T>::pointer
                    >::type
                >::value
            >::type> : std::true_type { };

    template<typename It,
        typename std::enable_if<!is_const_iterator<It>::value>::type* = nullptr>
    void foo(It i)
    {
        // Does something with i...
    }

    int main()
    {
        std::vector<int> v;
        foo(v.begin()); // OK
        foo(v.cbegin()); // ERROR!
    }
