#cpp #типы
Не очень понимаю, почему следующий код выводит 0 1 0. Какие типы у foo_1, foo_2 и foo_3? void foo() {} int main() { using foo_1 = decltype(foo); using foo_2 = const foo_1&; using foo_3 = foo_1&; std::cout << std::is_same_v<< '\n' << std::is_same_v << '\n' << std::is_same_v << '\n'; } Тем более на gcc следующий код даёт одинаковые значения std::cout << typeid(foo_1).name() << '\n' << typeid(foo_2).name() << '\n' << typeid(foo_3).name() << '\n';
Ответы
Ответ 1
foo_2 и foo_3 являются ссылками на функцию (причём const для foo_2 проигнорирован и эти типы вообще полностью идентичны). В то время как foo_1 тип - функция (не указатель на функцию). Поэтому и получается такой результат в std::is_same_v. Несколько примеров: #includevoid f() {} int main() { using F = decltype(f); // тип функции using FR = void(&)(); // тип ссылки на функцию using FP = void(*)(); // тип указателя на функцию (using форма) typedef void (*FP2)(); // тип указателя на функцию (typedef форма) std::cout << std::boolalpha; std::cout << std::is_same_v << "\n"; // true (F - функция) std::cout << std::is_same_v << "\n"; // false (F - не ссылка на функцию) std::cout << std::is_same_v << "\n"; // false (F - не указатель на функцию) std::cout << std::is_same_v << "\n"; // true (FP и FP2 одно и то же, заданное разными способами) std::cout << std::is_same_v << "\n"; // true (F& - ссылка на функцию) std::cout << std::is_same_v << "\n"; // true (const не влияет на тип ссылки на функцию) std::cout << std::is_same_v << "\n"; // true (const не влияет на тип функции) std::cout << std::is_same_v << "\n"; // false (const влияет на тип указателя на функцию) } При этом typeid(/* */).name() даёт одинаковые результаты потому, что для ссылок и значений он работает единообразно, можете попробовать например typeid(int&).name() и typeid(int).name(). А учитывая неявные преобразования между типом функции и типом указателя на функцию одинаковость результата здесь тоже не вызывает особых вопросов. Ответ 2
Тип foo - void (void), foo_2 и foo_3 - void ( & ) (void). const в этом контексте ничего не делает (warning: 'const' qualifier on function type 'foo_1' (aka 'void ()') has no effect [-Wignored-qualifiers]) typeid выдает одинаковые результаты потому что не различает ссылок.
Комментариев нет:
Отправить комментарий