如何找出编译器生成了哪些函数?

Hel*_*ein 11 c++ c++11

我知道编译器生成的函数、三规则和五规则。在现实世界的场景中,确定编译器实际创建了哪些编译器生成的函数(构造函数、赋值运算符、析构函数)可能并非易事。

有没有办法列出特定类的编译器生成的函数?

我主要对 Visual Studio 2019 和 Xcode 感兴趣,但更受欢迎的通用解决方案。

bol*_*lov 11

规则很复杂。我将从另一个答案中窃取,该答案引用了Howard Hinnant 演讲中的表格。

在此处输入图片说明

这里的寓意是,一个好的做法是不依赖编译器隐式声明并显式声明每个特殊成员(默认或删除,取决于您的需要)

  • @bolov 该图表很有用,但这并不能回答我的问题。我想找出哪些函数实际上是由编译器生成的。换句话说:我不是问理论上应该发生什么,而是问实践中发生了什么。 (2认同)

Jes*_*uhl 7

“有没有办法列出特定类的编译器生成的函数?”

当然有。在Linux(和其他 Unix 系统)上,您可以使用nm,readelfobjdump在生成的目标文件/库/可执行文件上反汇编它们并检查任何导出的符号(以及更多)。

我知道Windows上有类似的工具,但这不是我经常使用的平台,所以不幸的是我无法在那里命名确切的工具名称。