使用模板 static_assert 时,预计只有在实例化模板函数时断言才会失败。然而,在某些情况下,就像下面提出的那样,甚至在调用函数之前编译就会失败:
template <typename T> inline T getValue(AnObject&) { static_assert(false , "this function has to be implemented for desired type"); }
根据 [temp.res]/ 中的 C 标准8:
“如果无法为模板定义生成有效的专业化,并且该模板未实例化,则模板定义格式错误,无法诊断必需。”
在提供的模板中,无法生成有效的专业化,因为 static_assert 条件始终为 false。因此,模板定义的格式不正确。即使没有实例化,编译器也可能会提前拒绝它。
要解决此问题,可以按如下方式修改模板:
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 desired type"); }
这样,编译器无法立即拒绝函数模板,因为它需要在评估 static_assert 条件之前实例化 foobar 的适当特化。因此,只有在函数实际实例化并且断言失败时才会出现编译错误。
以上是为什么未调用的模板函数'static_assert”编译失败?的详细内容。更多信息请关注PHP中文网其他相关文章!