模块名称是否位于单独的 "name space" 中,或者它们是否会与例如模块冲突?变量名?

Does module names reside in a separate "name space", or could they collide with e.g. variable names?

我 guess/hope 模块名称不会与例如变量的名称。有人可以确认这一点,并可能参考(即将发布的)标准中的合适部分吗?

文件:a_module.cc

export module a_module;
export int add(int a, int b) { return a + b; }

// Question-1: Is using 'a_module' below as variable name allowed, or does
// the 'export module a_module' above prevent us from using that name?
int a_module = 11;

文件:main.cc

import a_module;

// Question-2: Is using 'a_module' below as variable name fine, or does the
// 'import a_module' above prevent us from using that name?
int a_module = 42;

int main() { return add(1, 2); }

很难引用否定的,但是是的 - 模块名称不能与 non-module 名称冲突。

我们在 C++ 中有许许多多种类的名称查找,但其中 none 考虑的是模块名称。就像语句 f(x); 可以找到许多名为 fx 的东西,那些 () 甚至可能意味着不同的东西,但它永远找不到 [=36] =]模块 命名为fx。将模块命名为一个或另一个或两者都不会更改任何查找。

同样,在序言中,所有与module相关的语句(importexport、模块声明或分区声明)仅考虑模块名称。如果你有类似的东西:

import M1;
import M2;

M1 恰好导出了一些名称 M2,这不会破坏 M2 的后续 import。具体来说,我们只是在寻找名为 M2.

module

您不必担心这两者之间的冲突。