我正在尝试将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(失败)
有人知道这是否有办法吗?
编辑:
它看起来确实像是编译器错误
如果我在上面添加一行强制编译器记住该类型,则它将起作用。
#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, "");
}