知识卡片
条件禁用转发模板
内容
enable_if 可在条件不满足时让模板退出候选集合,例如排除当前类及派生类,让复制构造走正确入口。它控制“是否参与重载”,不只是函数体里再作判断;若等到实例化函数体才报错,错误候选已经抢占调用。
参考来源
- 位置:《Effective Modern C++》第5章《右值引用,移动语义,完美转发》,条款二十七:熟悉通用引用重载的替代方法(源文件:_epub-src/EPUB/text/ch006.xhtml)
- 结论依据:原文把enable_if定义为让不满足条件的模板如同不存在,并用转发构造排除类型举例。
- 原始内容:std::enable_if 可以给你提供一种强制编译器执行行为的方法,像是特定模板不存在一样。这种模板被称为被 禁止 (disabled)。默认情况下,所有模板是 启用 的(enabled),但是使用 std::enable_if 可以使得仅在 std::enable_if 指定的条件满足时模板才启用。在这个例子中,我们只在传递的类型不是 Person 时使用 Person 的完美转发构造函数。如果传递的类型是 Person ,我们要…