尽管调用空函数,静态断言编译失败
使用带有 c 0x 标志的 g 4.6.3,开发人员遇到了意外的编译错误:
template <typename T> inline T getValue(AnObject& {}) { static_assert(false, "this function has to be implemented for 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 desired type"); }
通过此修改,编译器无法立即拒绝模板,因为它需要实例化 foobar
以上是尽管调用了空函数,为什么静态断言编译失败?的详细内容。更多信息请关注PHP中文网其他相关文章!