正如模块提案目前所代表的那样,我知道的唯一原因是处理循环接口依赖关系。
如果一个程序由模块组成并且它没有将函数声明与定义分开,那么所有模块文件都将是模块接口(与模块实现相反)。如果要将它们与头文件和代码文件进行比较,可以将模块接口视为头文件(.hpp),将模块实现视为代码(.cpp)文件。
不幸的是,模块提案不允许循环模块接口依赖。而且由于您的程序现在完全由模块接口组成,因此您将永远无法拥有两个以任何方式相互依赖的模块(这可能会proclaimed ownership
在将来的声明中得到改进,但目前不支持) . 解决循环模块接口依赖关系的唯一方法是将声明和定义分开并将循环导入放在模块实现文件中,与循环模块接口依赖关系相反,允许循环模块实现依赖关系。
以下代码提供了一个示例,说明如果不分离声明和定义就无法编译:
Foo module file
export module Foo;
import module Bar;
export namespace Test {
class Foo {
public:
Bar createBar() {
return Bar();
}
};
}
Bar module file
export module Bar;
import module Foo;
export namespace Test {
class Bar {
public:
Foo createFoo() {
return Foo();
}
};
}
本文展示了一个示例,说明如何在proclaimed ownership
声明可用的情况下解决此问题。本质上,它归结为分离声明和定义。
在一个完美的世界中,编译器将能够处理这种情况,但是,唉,据我所知,当前提议的模块实现不支持它。