据我所知,pimpl习惯用法将私有实现隐藏在向前声明的符号名称后面,以便可以在私有cpp模块中声明和使用它。
示例:https://cpppatterns.com/patterns/pimpl.html
据我所知,因为类hosint pimpl需要知道它的结构(大小,对齐),pimpl必须通过某种指针间接。
(or被分配为足够大小的块,然后被移动/创建到稍后由强制转换重新解释的位置中)。
即将到来的模块规范是否以任何方式解决了这个问题?
据我所知,pimpl习惯用法将私有实现隐藏在向前声明的符号名称后面,以便可以在私有cpp模块中声明和使用它。
示例:https://cpppatterns.com/patterns/pimpl.html
据我所知,因为类hosint pimpl需要知道它的结构(大小,对齐),pimpl必须通过某种指针间接。
(or被分配为足够大小的块,然后被移动/创建到稍后由强制转换重新解释的位置中)。
即将到来的模块规范是否以任何方式解决了这个问题?
2条答案
按热度按时间5n0oy7gb1#
P0142R0
5.2.3导出类属性
标准C++的一个偶尔令人烦恼的规则是控件访问,而不是可见性。例如,类的私有成员对非成员实体可见,但不可访问。特别地,对类的私有成员的任何改变都可能触发依赖于该类的定义的任何翻译单元的电子处理,即使该改变不影响依赖单元的有效性。用模块系统来解决这个问题是很有诱惑力的。然而,对于类成员有两套不同的规则(可见性和可访问性),我们认为这是不受欢迎的,并且可能是混乱的根源。此外,我们希望支持现有代码到模块的大规模迁移,而无需程序员担心类成员名称查找规则:如果你现在理解了这些规则,那么当你转向模块时,你就不必学习新的规则,也不必担心你使用的类是如何提供的(通过模块或非模块)。
规则3一般来说,一个类的任何属性(例如:在模块的导出声明部分中计算的参数(例如,参数的完整性)可用于导入模块。
由于类的所有属性对导入器都是可见的,因此对这些属性的任何更改都将在导入器中可见。我不认为模块能解决PIMPL所解决的问题。
mec1mxoz2#
如果将公共成员函数重写为自由函数,则可以用模块替换pimpl。https://youtu.be/tjSuKOz5HK4?t=865