C++ 20? 模块 - 不导出私有

C++ 20? modules - no exporting of privates

本文关键字:模块 C++      更新时间:2023-10-16

观看了 2 CppCon Gabriel Dos Reis 关于模块 TS 的演讲。

我记得他不想导出任何私有成员/函数,所以其他模块根本无法使用它们。

我理解他的立场,但这不会与未来的C++反思相冲突吗?例如,当C++有一个可以枚举所有类函数的反射时,它不应该也能够枚举私有函数吗?

我知道,访问私有函数是不好的,但在极少数极端情况下,这是必要的(有时需要如何const_cast,尽管编写它的开发人员应该感觉很糟糕)

编辑:

并且"不公开私有"至少有一个例外 - 如果类使用"非虚拟接口"模式

模块不会(如目前定义的那样)改变C++在基本层面上的工作方式。它更改了一些内容,包括可以访问的名称以及可从何处访问的名称。但它不会改变语言使用这些名称的工作方式。

因此,如果静态反射出现并允许你谈论一个类的私人成员,那么你可以谈论一个类的私人成员。该类定义是通过 #include 指令还是模块包含获得的都无关紧要。

要允许Gabriel Dos Reis想要的东西,需要对反射规则做出明确的例外。这不太可能发生。

这也不是那么重要。虽然能够从模块文件中删除私有成员(以及它们使用的任何非导出类型)会使模块文件变小,但我认为这个额外的模块文件大小不会那么大。它允许您做的主要事情是对模块源代码进行某些更改,这些更改不需要重新编译包含您的模块的模块。但是一个模块化的代码库无论如何都应该有相对快速的编译。因此,虽然它会很好,但它几乎不是必需的。