[英]If a C++ module partition B imports module partition A, is anything imported by partition A also visible in partition B?
在一个有分区的模块中,我注意到如果一个分区导入另一个分区,则第二个分区导入的所有内容在第一个分区中也可见。 这是正确的行为还是编译器中的错误?
我正在使用 VS2022。
假设我们有一些模块 Foo:
// Foo.ixx
export module Foo;
export void foo()
{
};
我们还有另一个带有两个分区的模块 Bar:
// Bar.ixx
export module Bar;
export import :PartA;
export import :PartB;
第一个分区导入模块 Foo:
// PartA.ixx
export module Bar:PartA;
import Foo;
export void partA()
{
foo();
}
第二个分区导入第一个分区:
// Part B.ixx
export module Bar:PartB;
import :PartA;
export void partB()
{
partA();
foo(); // should this compile?
}
分区 partB 从模块 Foo 调用 function foo()。 partB 没有导入 Foo,但是 partA 导入了。 在 VS2022 中,项目编译正常,但 Intellisense 抱怨“foo”未定义。 哪一个是正确的?
[basic.scope.namespace]/2说明一个 TU 中使用的名称是否在导入它的 TU 的 scope 中。 简短版本是如果Bar:Part2
导入Foo
则foo
可见。
所以……是吗?
是的。
当模块分区单元导入另一个分区(必须是同一个模块,因为你不能导入其他人的分区)时,它也会隐式导入该分区import
的非export
TU :
此外,当某个模块
M
的模块单元中的模块导入声明导入M
的另一个模块单元U
时,它还会导入由U
的模块单元范围内的非导出模块导入声明导入的所有翻译单元。
所以Bar:Part2
间接导入Foo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.