【发布时间】:2020-04-24 05:52:08
【问题描述】:
我知道编译器生成的函数、三法则和五法则。在现实世界的场景中,准确地确定哪些编译器生成的函数(构造函数、赋值运算符、析构函数)实际上是由编译器创建的,这可能并非易事。
有没有办法列出特定类的编译器生成的函数?
我主要对 Visual Studio 2019 和 Xcode 感兴趣,但更欢迎通用解决方案。
【问题讨论】:
我知道编译器生成的函数、三法则和五法则。在现实世界的场景中,准确地确定哪些编译器生成的函数(构造函数、赋值运算符、析构函数)实际上是由编译器创建的,这可能并非易事。
有没有办法列出特定类的编译器生成的函数?
我主要对 Visual Studio 2019 和 Xcode 感兴趣,但更欢迎通用解决方案。
【问题讨论】:
“有没有办法列出特定类的编译器生成的函数?”
当然有。在 Linux(和其他 Unix 系统)上,您可以在生成的目标文件/库/可执行文件上使用 nm、readelf 和 objdump 来反汇编它们并检查任何导出的符号(以及更多)。
Windows 上也有类似的工具,我知道,但这不是我经常使用的平台,所以很遗憾我无法在其中命名确切的工具名称。
【讨论】:
规则很复杂。我会窃取from another answer 引用Howard Hinnant's presentation 的表格。
这里的寓意是,一个好的做法是不依赖编译器隐式声明并显式声明每个特殊成员(默认或删除,取决于您的需要)
【讨论】: