Constexpr函数作为SFINAE的模板参数

时间:2019-07-12 22:56:35

标签: c++ templates c++17 constexpr enable-if

任何人都可以澄清以下原因为何不起作用:

xyz

请注意,如果不使用函数,而是直接编译#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 。 这发生在MSVC 2019版本16.1.6

2 个答案:

答案 0 :(得分:0)

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

您可以创建一个功能(而不是SFINAEd),而在体内使用if constexpr,而不是创建两个单独的功能。

答案 1 :(得分:0)

在我报告之后,他们似乎已将其修复:

  

此问题的修复程序已在16.2 Preview 3中发布!