Вывод аргумента шаблона класса для массива указателей на функции работает на Clang, но не на GCC - PullRequest
0 голосов
/ 17 января 2019

следующий код:

#include <array>

template <int i>
auto f(){}

int main () {
    std::array{f<5>};
}

компилируется с clang 7.0, но не работает с gcc 8.2 с сообщением

prog.cc: In function 'int main()':
prog.cc:7:20: error: class template argument deduction failed:
     std::array{f<5>};
                    ^
prog.cc:7:20: error: no matching function for call to 'array(<unresolved overloaded function type>)'
In file included from prog.cc:1:
/opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:244:5: note: candidate: 'template<class _Tp, class ... _Up> std::array(_Tp, _Up ...)-> std::array<typename std::enable_if<(is_same_v<_Tp, _Up> && ...), _Tp>::type, (1 + sizeof... (_Up))>'
     array(_Tp, _Up...)
     ^~~~~
/opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:244:5: note:   template argument deduction/substitution failed:
prog.cc:7:20: note:   couldn't deduce template parameter '_Tp'
     std::array{f<5>};
                    ^
In file included from prog.cc:1:
/opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:94:12: note: candidate: 'template<class _Tp, long unsigned int _Nm> array(std::array<_Tp, _Nm>)-> std::array<_Tp, _Nm>'
     struct array
            ^~~~~
/opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:94:12: note:   template argument deduction/substitution failed:
prog.cc:7:20: note:   couldn't deduce template parameter '_Tp'
     std::array{f<5>};
                ^

Является ли этот код законным? Если нет, то как мне это исправить?

1 Ответ

0 голосов
/ 17 января 2019

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

В конечном счете, обходной путь - разделить объявления.

auto *p = f<5>;
std::array{p};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...