xml*_*lmx 19 c++ final type-traits c++11
代码优先.
#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;
}
Run Code Online (Sandbox Code Playgroud)
如何实现类is_final?
类型特征通常使用SFINAE惯用法实现,该习惯用法在函数模板声明中放置了可能不正确的表达式.将有问题的typename替换为声明会导致错误,但错误在该上下文中被抑制,因此声明是否使用.但是后备过载会备份可能缺失的声明.另一部分代码访问该函数以检测敏感过载或仅实例化备份.
这不起作用,final因为它只能在类的模板实例化期间导致失败.没有办法重载类,也没办法暂时定义一个失败的类,但是如果它是从final派生的,则不会停止编译.
标准引用,C++11§14.8.2/ 8:
只有函数类型的直接上下文中的无效类型和表达式及其模板参数类型才会导致演绎失败.[注意:对替换类型和表达式的评估可能会导致副作用,例如类模板特化和/或函数模板特化的实例化,隐式定义函数的生成等.这些副作用不在"立即上下文"并且可能导致程序格式不正确. - 结束说明]