Here描述了弱模块所有权模型和强模块所有权模型之间的区别:
// lib_A.cpp
export module lib_A;
export int f() { return 0; }
// lib_B.cpp
export module lib_B;
export int f() { return 1; }
- 在弱所有权模型中:f的多重定义;链接器可以选择其中之一。
- 在强所有权模型中:好的,lib_A 中的 f 和 lib_B 中的 f 是不同的实体。
但是没有解释如何选择其中之一。
它可能依赖于编译器吗?它可能是编译器配置参数吗?还有什么吗?
最佳答案
如链接中所述:
If two matching declarations are attached to different modules, and they both declare names with external linkage, the program is ill-formed; no diagnostic is required if neither is reachable from the other.
标准到此结束。所有“所有权”的东西只是编码不同的实现可能如何处理它。它只是解释实现差异;这不是您可以选择或控制的东西。
编译器或链接器在每种情况下都检测此类冲突在功能上是不切实际的。这就是为什么不需要诊断。
将此规则视为一种基于模块的形式的单一定义规则 (ODR)。
如果您在没有模块(和导出
)的情况下编写此代码,则该代码格式不正确,由于违反了 ODR,因此无需进行诊断。您对同一声明实体有两个定义,但定义不同。
但是模块提供了 ODR 保护:模块权限内的声明与其他模块中同名的其他声明不同。这两个定义没有定义相同的声明实体。
上述规则的作用实际上是说,模块的 ODR 保护仅适用非导出
声明。导出实体之间的定义冲突就像非模块情况一样。
关于C++20 模块 : how to pick the strong or weak ownership model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77374482/