Я пытаюсь использовать invoke_result
с шаблонной функцией, тип возврата которой auto; и у меня проблема с Visual Studio 2017
Я получаю сообщение об ошибке, в котором говорится, что «аргумент шаблона не может быть типом, содержащим« auto »»
Приведенный ниже код прекрасно работает с GCC, Clang и ICC. Это не помогает MSVC 2017. Конечно, я установил флаг c ++ 17.
#include <type_traits>
template<typename U>
auto add_auto_template_fn(U a) {
return a + 42;
}
void static_test_invoke_result()
{
using T = std::invoke_result< decltype(&add_auto_template_fn<int>), int>::type;
static_assert(std::is_same<T, int>::value, "");
}
GCC:
https://godbolt.org/z/Vkn46P (работает с GCC, clang, ICC и т. Д.)
MSVC 2017:
https://godbolt.org/z/jCK1cO (не удалось)
Кто-нибудь знает, есть ли способ обойти это?
РЕДАКТИРОВАТЬ:
Это похоже на ошибку компилятора
Если я добавлю строку выше, которая заставит компилятор запоминать тип, это сработает.
https://godbolt.org/z/9Y8yUH
#include <type_traits>
template<typename U>
auto add_auto_template_fn(U a) {
return a + 42;
}
void static_test_invoke_result()
{
auto f = add_auto_template_fn<int>; // This innocent line will "solve" the issue
using T = std::invoke_result< decltype(add_auto_template_fn<int>), int>::type;
static_assert(std::is_same<T, int>::value, "");
}