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

Igo*_*vic 1 c++ templates sfinae

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;
}
Run Code Online (Sandbox Code Playgroud)

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

C2995'int test_sfinae(T)':函数模板已经定义

我正在使用MVSC.

Hol*_*olt 8

默认模板参数不参与重载解析,因此您的两个声明实际上是相同的.

你可以重写声明如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

什么时候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);
Run Code Online (Sandbox Code Playgroud)

因此,将选择第一个重载,并且当T不可轻易地复制时,反向.