首页 >后端开发 >C++ >C 类模板成员函数中的 ODR 使用是什么?

C 类模板成员函数中的 ODR 使用是什么?

Linda Hamilton
Linda Hamilton原创
2024-12-06 11:44:11980浏览

What is ODR-Use in C   Class Template Member Functions?

理解 C 中的 ODR 使用

在 C 编程环境中,讨论类时经常会出现“odr 使用”的概念模板成员函数。

单一定义规则 (ODR) 确保每个实体都有一个一致的定义跨程序中的所有翻译单元。 ODR-use 定义了实体何时必须提供定义,而不是简单的声明。

根据 C 标准,如果满足以下条件,则非重载函数被 odr-use:

  • 它的名字出现在一个可能求值的表达式中。
  • 它是通过重载选择的一组候选函数的成员
  • 它是一个非纯虚函数。

ODR-使用和类模板成员函数

用于类模板成员函数,ODR 使用规则意味着它们只有在满足条件时才会被实例化是:

  • 显式调用。
  • 虚拟且类本身被实例化(即使未调用该函数)。

此规则确保模板成员函数仅在实际需要时才实例化。默认情况下,编译器不会实例化未使用的成员函数,从而节省编译时间。

ODR-使用和多个编译单元

当使用多个编译单元时,编译器必须确保所有 ODR 使用的实体仅定义一次。它通过“主模板”的概念来实现这一点。主模板是翻译单元中模板的第一个实例。其他翻译单元中的所有后续模板实例化都被视为辅助实例化。

主模板负责提供 odr 使用的实体的定义。如果成员函数是 ODR 使用的,但未在主模板中调用,则仍必须使用定义来声明它以满足 ODR。

实例化所有成员函数

显式实例化类模板可以保证所有成员函数的实例化,包括未调用的 odr 使用的函数。这确保了完整的定义可用于所有编译单元,从而避免潜在的链接错误。然而,实例化未使用的成员函数并不总是必要或有效的。

以上是C 类模板成员函数中的 ODR 使用是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

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