首页  >  文章  >  后端开发  >  为什么 C 0x 中未调用的模板函数中的静态断言失败?

为什么 C 0x 中未调用的模板函数中的静态断言失败?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-06 16:42:03148浏览

Why Does a Static Assert Fail in an Uncalled Template Function in C  0x?

尽管未调用模板函数,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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn