C ++ 20?模块 - 没有私人出口

时间:2017-05-10 01:32:44

标签: c++ private c++-modules

观看2 CppCon Gabriel Dos Reis'谈论模块TS。

我记得他并不想导出任何私人会员/功能,所以其他模块根本无法使用它们。

我了解他的立场,但不会与未来的C ++反思发生冲突?例如,当C ++有一个可以枚举所有类函数的反射时,它是否也不能枚举私有函数?

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

编辑:

至少有一个例外,#34;不暴露私人" - 如果课程使用"非虚拟界面"图案

1 个答案:

答案 0 :(得分:2)

模块没有(如目前定义的那样)改变了C ++在基础层面的工作方式。它通过可访问的名称和可访问的位置更改了一些内容。但它并没有改变语言如何与这些名称一起使用。

因此,如果出现静态反射并允许您谈论类的私有成员,那么您可以谈论类的私有成员。是否通过#include指令或模块包含来找到类定义是无关紧要的。

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

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