与互斥的`enable_if`s一起定义的“功能模板”

时间:2019-05-24 01:03:47

标签: c++ templates sfinae typetraits enable-if

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条件。您能帮助我加深我的理解吗?

1 个答案:

答案 0 :(得分:3)

是的,它们的签名是相同的;默认模板参数不是功能模板签名的一部分。

您可以将它们更改为

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