У меня есть статическая функция, определенная в структуре, определенной внутри функции. Я хочу получить указатель функции шаблона на внутреннюю функцию.
Рассмотрим следующий пример:
template <class Func, Func GetToken>
struct token_user {
void foo () { GetToken(); } // Do something with token.
};
struct generator_out {
constexpr static const auto get_token() {return 0;}
};
int main() {
struct generator_in {
constexpr static const auto get_token() {return 0;}
};
// Works fine
token_user<decltype(&generator_out::get_token), &generator_out::get_token>();
// Fails with GCC, works with clang and msvc
token_user<decltype(&generator_in::get_token), &generator_in::get_token>();
}
Я проверил это с моим локальным компилятором MSVC 2017, а также с компилятором clang 6.0 и gcc 8.1 на wandbox.org. MSVC и clang работают, gcc - нет.
Кто прав? Clang и msvc слишком просты и не соответствуют стандарту c ++ или gcc просто еще не реализовал это? (Или это может быть даже ошибка?) Что стандарт говорит об этом?
EDIT :
Сообщение об ошибке от gcc:
prog.cc: In function 'int main()':
prog.cc:15:76: error: 'main()::generator_in::get_token' is not a valid template argument for type 'const int (*)()' because 'static constexpr const auto main()::generator_in::get_token()' has no linkage
token_user<decltype(&generator_in::get_token), &generator_in::get_token>(); // Fails with GCC, works with clang and msvc