C ++函数专业化对于普通类型和类的行为有所不同

时间:2018-06-27 07:28:44

标签: c++ templates template-meta-programming

我有这段代码(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;
    }

编译器使用intcharvoid*longbar为调用生成错误。 我预计会有longbar的错误。

我不明白的是:

  1. 为什么intcharfoo被不同对待?
  2. 为什么void*foo*的待遇不同? (都是ptrs)

我认为原因与foo蜂类类型以及intchar蜂类普通类型有关。
我想知道原因。是编译器错误还是标准中有某些段落解释这种行为?

我要问的不是我如何解决此问题(有关修复,请参阅链接到coliru)。 我想知道的是为什么它会如此表现。

0 个答案:

没有答案