"Function template has already been defined"与相互排斥的"enable_if"一起

"Function template has already been defined" with mutually exclusive `enable_if`s

本文关键字:enable 一起 if template Function has already defined been      更新时间:2023-10-16

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;
}

// 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;
}