“函数模板已被定义”,具有互斥的 `enable_if`

2023-12-07

对于以下代码,MSVC 会产生错误(“函数模板已被定义”):

template<typename T, typename = std::enable_if_t<std::is_default_constructible<T>::value>>
auto foo(T&& val) {
    return 0;
}

// note difference from above --->               !
template<typename T, typename = std::enable_if_t<!std::is_default_constructible<T>::value>>
auto foo(T&& val) {
    return 0;
}

我认为它会起作用,因为存在相互排斥的 sfinae 条件。你能帮我解决我理解上的漏洞吗?


是的,他们的签名是一样的;默认模板参数不是函数模板签名的一部分。

您可以将它们更改为

// the 2nd non-type template parameter are different
template<typename T, std::enable_if_t<std::is_default_constructible<T>::value>* = nullptr>
auto foo(T&& val) {
    return 0;
}

template<typename T, std::enable_if_t<!std::is_default_constructible<T>::value>* = nullptr>
auto foo(T&& val) {
    return 0;
}

Or

// the return type are different
template<typename T>
std::enable_if_t<std::is_default_constructible<T>::value, int> foo(T&& val) {
    return 0;
}

template<typename T>
std::enable_if_t<!std::is_default_constructible<T>::value, int> foo(T&& val) {
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“函数模板已被定义”,具有互斥的 `enable_if` 的相关文章

随机推荐