Специализация функций C ++ ведет себя по-разному для простых типов и классов - PullRequest
0 голосов
/ 27 июня 2018

У меня есть этот кусок кода (http://coliru.stacked -crooked.com / a / ee05a00fc8ab5057 ):

    #include <type_traits>

    struct unregistered;
    unregistered register_type(...);
    template<class T>
    constexpr bool is_registered = !std::is_same_v<unregistered, decltype(register_type(std::declval<T>()))>;

    template<class T>
    struct test_registration
    {
        static_assert(is_registered<T>, "Type is not registered!");
    };

    struct foo{};
    struct bar{};

    void register_type(int);
    void register_type(char);
    void register_type(void*);
    void register_type(foo);
    void register_type(foo*);

    #include <boost/core/demangle.hpp>
    #include <iostream>

    int main()
    {
        std::cout << boost::core::demangle(typeid(test_registration<foo>).name()) << "\n";
        std::cout << boost::core::demangle(typeid(test_registration<foo*>).name()) << "\n";

        std::cout << boost::core::demangle(typeid(test_registration<int>).name()) << "\n";
        std::cout << boost::core::demangle(typeid(test_registration<char>).name()) << "\n";
        std::cout << boost::core::demangle(typeid(test_registration<void*>).name()) << "\n";

        std::cout << boost::core::demangle(typeid(test_registration<long>).name()) << "\n";
        std::cout << boost::core::demangle(typeid(test_registration<bar>).name()) << "\n";
        return 0;
    }

Компилятор генерирует ошибки для вызовов, используя int, char, void*, long и bar. Я ожидаю ошибки для long и bar.

Что я не понимаю, так это:

  1. Почему int, char и foo обрабатываются по-разному?
  2. Почему void* и foo* обрабатываются по-разному? (оба являются ptrs)

Я предполагаю, что причина связана с foo типом beeing и int и char типом beeing.
Я хотел бы знать причину. Это ошибка компилятора или в стандарте есть какой-то отрывок, объясняющий это поведение?

Я спрашиваю не о том, как я могу решить эту проблему (см. Ссылку на coliru для исправления). Я хочу знать, почему он так себя ведет.

...