我希望模块能够为通常不会包含标题的内容提供定义。
想象一下这个模块:
export module hello;
export inline auto say_hello() -> char const* {
return "hello world";
}
如您所见,该函数是内联的。它也在界面中。现在有了标题,就没有地方放实现了。为了使内联函数成为可能,该语言允许找到多个定义。所以每个 TU 在目标文件中输出自己的定义。
这是使用模块可以避免的重复工作。如您所见,模块接口就像任何其他 cpp 文件一样是 TU。当您导出内联函数时,是的,该实现对其他 TU 可用,但并非所有tu 都必须提供实现,因为它可以放在一个地方:其中包含内联函数的 TU。
我期望与 constexpr 变量相同。它们也需要定义,因为您可以为它们提供参考或地址。以此为例:
export module foo;
import <tuple>;
export constexpr auto tup = std::tuple{1, 'a', 5.6f};
import foo;
int a = std::get<0>(tup);
该std::get
函数采用对元组的引用。即使它是一个 constexpr 变量,某些上下文(尤其是没有优化的情况)可能需要使用 ODR 变量。
所以在我的例子中,即使模块foo
只导出一个 constexpr 变量,我希望 cpp 文件编译成一个包含定义的目标文件。
也可能发生目标文件内没有任何内容的情况。我也希望它今天表现得像一个空的 TU:
// I'm empty
cpp
您可以毫无问题地将此类文件添加到项目中,并将其链接到您的可执行文件。我希望这些工具与模块的行为相同。