SFINAE 没有使用一个非常简单的例子

SFINAE not working with a very simple example

template<typename T, typename = std::enable_if_t<std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T tc) {
    return 1;
}

template<typename T, typename = std::enable_if_t<!std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T ntc) {
    return 2;
}

有人可以向我解释为什么此代码无法编译并给出此错误消息:

C2995 'int test_sfinae(T)': function template has already been defined

我正在使用 MVSC。

默认模板参数不参与重载决议,所以你的两个声明实际上是相同的。

您可以按如下方式重写声明:

template <typename T, 
          std::enable_if_t<std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T tc) {
    return 1;
}

template <typename T, 
          std::enable_if_t<!std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T ntc) {
    return 2;
}

T 可简单复制时,声明将显示为:

template <typename T, int = 0>
inline int test_sfinae(T tc);

template <typename T, /* Something that does not compile... */ = 0>
inline int test_sfinae(T ntc);

因此将选择第一个重载,而当 T 不可平凡复制时的逆过程。