这是 MSVC++ 中的错误吗?
是的,我想是的。
我怎样才能让它在所有编译器中工作?
不要问我为什么,但如果你通过一个助手 struct 为 enable_if_returns 如下所示
template <typename T, typename F,
bool = std::is_same_v<T, get_return_type<F>>>
struct enIfR
{ };
template <typename T, typename F>
struct enIfR<T, F, true>
{ using type = T; };
template <typename T, typename F>
using enable_if_returns = typename enIfR<T, F>::type;
您的代码也在 MSVC 中编译。
下面是一个完整的编译(MSVC也是)例子
#include <iostream>
#include <type_traits>
template <typename Function>
using get_return_type = decltype(std::declval<Function>()());
template <typename T, typename F,
bool = std::is_same_v<T, get_return_type<F>>>
struct enIfR
{ };
template <typename T, typename F>
struct enIfR<T, F, true>
{ using type = T; };
template <typename T, typename F>
using enable_if_returns = typename enIfR<T, F>::type;
template<typename T, typename Function>
using enable_if_returns0 = typename std::enable_if<
std::is_same<T, get_return_type<Function>>::value>::type;
template<typename T, typename... Functions>
using enable_if_all_returns = std::void_t<typename enIfR<T, Functions>::type...>;
int main()
{
constexpr auto fint = []() -> int { return 1; };
constexpr auto fstring = []() -> std::string { return "asd"; };
(enable_if_returns<int, decltype(fint)>)0; // ok
//(enable_if_returns<int, decltype(fstring)>)0; // fail on all (expected)
//(enIfR<int, decltype(fstring)>::type)0; // fail on all (expected)
(enable_if_all_returns<int, decltype(fint)>)0; // fail in MSVC (NOT expected, 'get_return_type<unknown-type>' being compiled)
//(enable_if_all_returns<int, decltype(fint), decltype(string)>)0; // fail in all (expected)
return 0;
}