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!
任何人都可以解释为什么以下不起作用:
#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!