Неразрешенный тип перегруженной функции в gcc - PullRequest
2 голосов
/ 11 марта 2020

Я пытаюсь передать шаблон функции в качестве аргумента другой функции, как показано в примере ниже.

#include <iostream>

template <typename T>
decltype(auto) foo(T t)
{
    return t;
}

template <typename Fn, typename T>
decltype(auto) bar(Fn fn, T t)
{
    return fn(t);
}

int main()
{
    int arg = 0;

    std::cout << bar(foo<decltype(arg)>, arg) << std::endl;

    return 0;
}

Хотя это работает в clang 9.0 и msv c v19.24, происходит сбой при выводе g cc 9.2

g cc:

no matching function for call to 'bar(<unresolved overloaded function type>, int&)' std::cout << bar(foo<decltype(arg)>, arg) << std::endl;

Это ошибка в g cc? Также я могу как-то обойти это в g cc?

Годболт ссылка: https://godbolt.org/z/oCChAT

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Для г cc другой обходной путь может быть:

auto f = foo<decltype(arg)>;
std::cout << bar(f, arg) << std::endl;
1 голос
/ 11 марта 2020

Да, это должно быть ошибка g cc, которая не была исправлена ​​даже в g cc 10.0.1 .

Кажется, g cc не может обработать этот случай при указании типа возвращаемого значения с помощью спецификаторов типа заполнителя , таких как auto и decltype(auto). Если вы укажете тип возврата как T, он будет работать нормально .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...