具有“自动”返回类型和MSVC 2017的模板函数的invoke_result

时间:2019-01-09 13:21:43

标签: c++ visual-c++ c++17 typetraits

我正在尝试将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, "");
}

0 个答案:

没有答案