invoke_result для функции шаблона с типом возврата «auto» и MSVC 2017 - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь использовать 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, "");
}
...