C++ 20?模块 - 不导出私有
C++ 20? modules - no exporting of privates
观看了 2 个 CppCon Gabriel Dos Reis 关于模块 TS 的演讲。
我记得他不想导出任何私有 members/functions,所以其他模块根本无法使用它们。
我理解他的立场,但会不会和以后的C++反思冲突?例如,当 C++ 具有可以枚举所有 class 函数的反射时,它不应该也能够枚举私有函数吗?
我知道,访问私有函数是不好的,但在极少数极端情况下是必要的(如何const_cast有时是必要的,尽管编写它的开发人员应该感觉很糟糕)
编辑:
并且 "not exposing privates" 至少有一个例外 - 如果 class 使用 "non virtual interface" 模式
模块不会(按照目前的定义)从根本上改变 C++ 的工作方式。它改变了一些事情,包括哪些名字可以访问以及从哪里可以访问。但它不会改变语言如何处理这些名称。
因此,如果出现静态反射并允许您谈论 class 的私有成员,那么您就可以谈论 class 的私有成员。 class 定义是通过 #include 指令还是模块包含来提供给您的,这无关紧要。
要允许 Gabriel Dos Reis 想要的东西,需要对反射规则进行明确的例外处理。这不太可能发生。
而且它也不是那么重要。虽然能够从模块文件中删除私有成员(以及它们使用的任何非导出类型)会使模块文件小很多,但我认为这个额外的模块文件大小不会有什么大不了的。它允许您做的主要事情是对模块源代码进行某些更改,不需要重新编译包含您的模块的模块。但是无论如何,良好模块化的代码库应该具有相对快速的编译。所以虽然它会很好,但它并不是必需的。
观看了 2 个 CppCon Gabriel Dos Reis 关于模块 TS 的演讲。
我记得他不想导出任何私有 members/functions,所以其他模块根本无法使用它们。
我理解他的立场,但会不会和以后的C++反思冲突?例如,当 C++ 具有可以枚举所有 class 函数的反射时,它不应该也能够枚举私有函数吗?
我知道,访问私有函数是不好的,但在极少数极端情况下是必要的(如何const_cast有时是必要的,尽管编写它的开发人员应该感觉很糟糕)
编辑:
并且 "not exposing privates" 至少有一个例外 - 如果 class 使用 "non virtual interface" 模式
模块不会(按照目前的定义)从根本上改变 C++ 的工作方式。它改变了一些事情,包括哪些名字可以访问以及从哪里可以访问。但它不会改变语言如何处理这些名称。
因此,如果出现静态反射并允许您谈论 class 的私有成员,那么您就可以谈论 class 的私有成员。 class 定义是通过 #include 指令还是模块包含来提供给您的,这无关紧要。
要允许 Gabriel Dos Reis 想要的东西,需要对反射规则进行明确的例外处理。这不太可能发生。
而且它也不是那么重要。虽然能够从模块文件中删除私有成员(以及它们使用的任何非导出类型)会使模块文件小很多,但我认为这个额外的模块文件大小不会有什么大不了的。它允许您做的主要事情是对模块源代码进行某些更改,不需要重新编译包含您的模块的模块。但是无论如何,良好模块化的代码库应该具有相对快速的编译。所以虽然它会很好,但它并不是必需的。