Constexpr 函数作为 SFINAE 的模板参数

Constexpr function as template parameter for SFINAE

任何人都可以解释为什么以下不起作用:

#include <type_traits>
#include <iostream>

template<typename T, typename U>
constexpr bool is_same_fn()
{
    return std::is_same_v<T, U>;
}

template<typename T, std::enable_if_t<is_same_fn<T, int>(), bool> = true>
void fn2() { std::cout << "True mg\n"; }

template<typename T, std::enable_if_t<!is_same_fn<T, int>(), bool> = true>
void fn2() { std::cout << "False mg\n"; }

int main() {
    fn2<int>();
    fn2<char>();
    return 0;
}

请注意,如果我没有使用该函数,而是直接使用 std::is_same 作为模板参数,则可以编译同样的东西。

我得到的错误是:

error C2995:  'void fn2(void)': function template has already been defined
message :  see declaration of 'fn2'
error C3861:  'fn2': identifier not found

语言标准正确设置为:ISO C++17 Standard (/std:c++17)。 这发生在 MSVC 2019 版本 16.1.6

这两个函数具有相同的签名,唯一的区别是默认模板参数。要重载函数,重载必须采用不同的参数。

您可以创建一个函数(不是 SFINAEd)并在正文中使用 if constexpr,而不是创建两个单独的函数。

他们似乎在我报告后修复了它:

A fix for this issue has been released in 16.2 Preview 3!