非导出声明和私有模块片段中的声明有什么区别?

Bol*_*pat 6 c++ c++20 c++-modules

cppreference.com 关于模块的内容上,它说export

\n
\n

模块接口单元可以导出声明和定义,这些声明和定义可以由其他翻译单元导入。\n[\xe2\x80\xaf\xe2\x80\xa6\xe2\x80\xaf] \n模块接口中导出的
所有声明和定义给定命名模块的单元将在使用导入声明的翻译单元中可用。

\n
\n

据此猜测,我拥有export该模块的用户想要或需要使用它的一切。所有未export编辑的内容都是模块的实现细节,与importers\xe2\x80\x99 无关。

\n

它还告诉我

\n
\n

私有模块片段[ \xe2\x80\xaf\xe2\x80\xa6\xe2\x80\xaf] 允许将模块表示为单个翻译单元,而不使导入器可以访问模块的所有内容。

\n
\n

将某些内容放入私有模块片段中与不放入其中有什么区别exporting 有什么区别?\n我猜\xe2\x80\x99s 与使用导入声明\xe2\x80 的翻译单元中的\xe2\x80\x9cavailable 之间存在差异\x9d 和 \xe2\x80\x9c 对于导入者\xe2\x80\x9d 是可访问的。但从实际角度来看,这有什么区别呢?作为指导,我什么时候将某些内容放入私有模块片段中,什么时候不导出它?

\n

(突出显示我的内引号。)

\n

Nic*_*las 6

将某些内容放入私有模块片段中与不导出它有什么区别

实现方面的主要区别在于,模块接口中的非导出定义可以由属于同一模块的其他代码段(模块的实现单元和其他接口单元)导入。即使您不导出这些声明,他们也可以访问它们。因此,这些声明必须(在某种程度上)存在于编译器用于该模块的任何文件中。

相比之下,私有模块片段代码不会对模块的任何可访问接口做出贡献。它的作用就像一个模块实现单元。

但事情是这样的:你无法分辨出其中的区别。为什么?如果主模块接口有一个私有模块片段,则不能有任何其他文件属于同一模块。这是明确禁止的。私有模块片段作为工具的存在是为了支持您想要将完整模块作为单个文件发送的情况。没有什么是私有模块片段可以做而模块实现单元不能做的。

因此,如果可能存在私有模块片段(即:它是单文件模块),则导入该模块的代码将无法看到未导出的声明。

私有模块片段背后的主要目的是不可能从其中导出内容。这可以防止您在单文件实现中意外地执行此操作。