尽管未调用模板函数,Static_Assert 仍失败
在 C 0x 中,具有未使用的 static_assert 声明的模板可能会导致编译失败。考虑以下代码:
template <typename T> inline T getValue(AnObject&) { static_assert(false, "this function has to be implemented for the desired type"); }
令人惊讶的是,此代码失败并出现错误:
static_assertion failed "this function has to be implemented for the desired type"
直觉上,人们会期望编译器仅在调用模板函数时实例化模板函数。然而,C 标准在 [temp.res]/8 中另有规定:
对于可以生成有效专业化的模板定义,不应发出诊断。如果无法为模板定义生成有效的专业化,并且该模板未实例化,则模板定义格式错误,无需诊断。
由于没有可编译的有效专业化,因此允许编译器拒绝模板定义,无论它是否实例化。
要解决此问题,可以按如下方式重新定义代码:
template<typename T> struct foobar : std::false_type { }; template <typename T> inline T getValue(AnObject&) { static_assert(foobar<T>::value, "this function has to be implemented for the desired type"); }
此修改将诊断推迟到实例化适当的 foobar
以上是为什么 C 0x 中未调用的模板函数中的静态断言失败?的详细内容。更多信息请关注PHP中文网其他相关文章!