内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
编码
#include <iostream> using namespace std; struct A final {}; struct B {}; int main() { cout << is_final<A>::value << endl; // Output true cout << is_final<B>::value << endl; // Output false return 0; }
类型特征通常使用SFINAE成语来实现,该成语在函数模板声明中放置了一个可能不正确的表达式。将所述类型名称替换到声明中将导致错误,但错误在该上下文中被抑制,因此声明被使用或不使用。但后备过载支持可能丢失的声明。另一段代码访问该函数,以检测是否实例化了敏感重载或只实例化备份。
这不管用final
因为它只能在类的模板实例化过程中导致失败。无法重载类,也无法暂时定义一个类,如果它是从Final派生出来的,那么该类将失败,但不会停止编译。