Страницы

Поиск по вопросам

понедельник, 30 марта 2020 г.

Различные типы функций

#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. Несколько примеров: #include void 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 выдает одинаковые результаты потому что не различает ссылок.

Комментариев нет:

Отправить комментарий