Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;20? 模块-不出口私人物品_C++_Private_C++ Modules - Fatal编程技术网

C++ C++;20? 模块-不出口私人物品

C++ C++;20? 模块-不出口私人物品,c++,private,c++-modules,C++,Private,C++ Modules,观看了2个CppCon Gabriel Dos Reis关于模块TS的演讲 我记得他不想导出任何私有成员/函数,所以其他模块根本无法使用它们 我理解他的立场,但它不会与未来的C++思考冲突吗?例如,当C++有一个可以枚举所有类函数的反射时,它也不能枚举私有函数吗? 我知道,访问私有函数是不好的,但在极少数极端情况下是必要的(const_cast有时是必要的,尽管编写它的开发人员会感觉很糟糕) 编辑: 至少有一个例外是“不暴露私有”——如果类使用“非虚拟接口”模式 模块(如当前定义的),则不改变C

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

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

我理解他的立场,但它不会与未来的C++思考冲突吗?例如,当C++有一个可以枚举所有类函数的反射时,它也不能枚举私有函数吗? 我知道,访问私有函数是不好的,但在极少数极端情况下是必要的(const_cast有时是必要的,尽管编写它的开发人员会感觉很糟糕)

编辑:

至少有一个例外是“不暴露私有”——如果类使用“非虚拟接口”模式

模块(如当前定义的),则不改变C++在基本层次上的工作方式。它改变了一些东西,包括可以访问的名称以及从何处访问它们。但这并没有改变语言处理这些名称的方式

因此,如果出现静态反射,并允许您讨论类的私有成员,那么您可以讨论类的私有成员。该类定义是通过#include指令还是模块包含提供给您的并不重要

为了满足Gabriel Dos Reis的要求,需要对反射规则做出明确的例外。这不太可能发生


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

如果这是可能的,这可能会强制进行封装。此外,由于C++的理念是“只为您使用的东西付费”,因此强制模块保存信息以希望进行反射可能不是惯用方法。那么那些试图删除私有函数的优化呢?如果它们是私有的,它们是否应该被公开?关于运行时的“只为你看到的东西付费”不是吗?编译时C++使用相反的哲学:不幸的是,我对编译时间了解不多。我从没有听说过C++反射的任何计划。源代码?但是,在这种情况下,C++ 20标准不会要求类似的东西:如果模块中的命名空间被导出,所有内部类和它们的非私有成员函数都会导出并在其他模块中看到?明确提到“私人”一词。@Alek86:不。当前的报纸没有提到公共与私人。它只是说命名实体将是模块接口的一部分,因此任何导入它的人都可以看到它。如果导出类,则该类可见。