考虑以下模板函数:
template <typename T> inline T getValue(AnObject&) { static_assert(false, "this function has to be implemented for desired type"); }
使用 g 4.6.3 进行编译时,尽管未调用这个函数在任何地方,编译都会失败错误:
static_assertion failed "this function has to be implemented for the desired type"
此行为可能会引发问题,因为该函数未被调用,并且不应触发编译错误。但是,根据 [temp.res]/8 中的 C 标准:
If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
由于没有可行的方法来实例化具有可编译的有效专业化的函数模板,因此考虑模板定义本身格式不正确。这允许编译器甚至在任何实例化发生之前就拒绝它。
要解决此问题并允许延迟错误检测,可以按如下方式修改模板函数:
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"); }
通过使用额外的模板 struct foobar 作为编译时标志,编译器无法立即拒绝函数模板。实例化后,foobar
以上是为什么静态断言在未调用的模板函数中失败?的详细内容。更多信息请关注PHP中文网其他相关文章!