参数扣除失败,返回值有效
Deduction fails on parameter, works on return value
我试图在函数参数上使用std::enable_if
来触发SFINAE。编译失败,出现以下错误:
type_nonsense.cpp:20:5: error: no matching function for call to 'c'
c(SOME::VALUE);
^
type_nonsense.cpp:13:6: note: candidate template ignored: couldn't infer
template argument 'T'
void c(typename std::enable_if<std::is_enum<T>::value, T>::type t) {}
^
1 error generated.
将std::enable_if
移动到返回类型或伪模板参数可以很好地工作。为什么?
#include <type_traits>
// Works
template <typename T, typename dummy = typename std::enable_if<std::is_enum<T>::value, T>::type>
void a(T t) {}
// Works
template <typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type b(T t) {}
// Fails to compile
template <typename T>
void c(typename std::enable_if<std::is_enum<T>::value, T>::type t) {}
enum class SOME { VALUE };
int main() {
a(SOME::VALUE);
b(SOME::VALUE);
c(SOME::VALUE);
}
T
的类型。将std::enable_if
放在返回类型或作为默认模板参数中是有效的,因为T
的类型在这些上下文中没有推导出来。
如果你需要把它作为一个参数,你可以这样做:
template <typename T>
void c(T t, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr) {}
这是因为T
是由第一个参数推导的,而不是第二个。
对于编译失败的,T
不可扣除。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 从函数中返回值的有效方法
- 为什么将boost::move()的返回值分配给非常数引用在C++0x模式下失败,但在C++03模式下有效
- 为什么 queue:front() 的返回值在 queue::p op() 之后有效
- C++int函数.当零是有效的返回值时,我如何检测false
- 参数扣除失败,返回值有效
- 根据函数中C++中的值返回auto_ptr有效负载
- 哪个更有效:返回值与按引用传递
- 如何处理pam_authenticate对有效用户和密码的PAM_AUTHTOK_RECOVERY_ERR返回值