C++ CTAD无法使用部分专门化中的SFINAE推断模板参数
我尝试在部分专业化中使用CTAD和SFINAE,但除非添加一个看似无用的演绎指南,否则它无法编译。背后的原因/限制是什么C++ CTAD无法使用部分专门化中的SFINAE推断模板参数,c++,templates,c++17,ctad,C++,Templates,C++17,Ctad,我尝试在部分专业化中使用CTAD和SFINAE,但除非添加一个看似无用的演绎指南,否则它无法编译。背后的原因/限制是什么 模板 结构A; 模板 结构A { A(T){std::cout { A(T){std::cout A;//需要这个,否则无法编译 int main() { A A{1}; } 隐式生成的演绎指南仅镜像主模板的构造函数,而不是专门化的构造函数 如果您去掉其中一个专门化,并将代码从其中移到主模板中,那么它将起作用: template<typename T, typename
模板
结构A;
模板
结构A
{
A(T){std::cout
{
A(T){std::cout A;//需要这个,否则无法编译
int main()
{
A A{1};
}
隐式生成的演绎指南仅镜像主模板的构造函数,而不是专门化的构造函数
如果您去掉其中一个专门化,并将代码从其中移到主模板中,那么它将起作用:
template<typename T, typename Enable = void>
struct A
{
A(T) { std::cout << "Other\n"; }
};
template<typename T>
struct A< T, std::enable_if_t<std::is_arithmetic_v<T>>>
{
A(T) { std::cout << "Numerical\n"; }
};
模板
结构A
{
A(T){std::cout
{
A(T){std::cout Justdelete
ingA(T)
在主函数中可能更好,特别是如果sfinae集更复杂。比如。这听起来不合理。因为我可以sfinae作为构造函数工作的“工厂函数”过载。