У меня есть этот кусок кода (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
типом beeing и int
и char
типом beeing.
Я хотел бы знать причину. Это ошибка компилятора или в стандарте есть какой-то отрывок, объясняющий это поведение?
Я спрашиваю не о том, как я могу решить эту проблему (см. Ссылку на coliru для исправления).
Я хочу знать, почему он так себя ведет.