我有这段代码(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
的错误。
我不明白的是:
int
,char
和foo
被不同对待?void*
和foo*
的待遇不同? (都是ptrs)我认为原因与foo
蜂类类型以及int
和char
蜂类普通类型有关。
我想知道原因。是编译器错误还是标准中有某些段落解释这种行为?
我要问的不是我如何解决此问题(有关修复,请参阅链接到coliru)。 我想知道的是为什么它会如此表现。