我知道编译器生成的函数,三个规则和五个规则。在实际情况下,准确地找出编译器实际创建了哪些编译器生成的函数(构造函数,赋值运算符,析构函数)可能并不容易。
有什么方法可以列出特定类的编译器生成的函数吗?
我主要对Visual Studio 2019和Xcode感兴趣,但是更欢迎使用通用解决方案。
我知道编译器生成的函数,三个规则和五个规则。在实际情况下,准确地找出编译器实际创建了哪些编译器生成的函数(构造函数,赋值运算符,析构函数)可能并不容易。
有什么方法可以列出特定类的编译器生成的函数吗?
我主要对Visual Studio 2019和Xcode感兴趣,但是更欢迎使用通用解决方案。
Answers:
规则很复杂。我将从另一个答案中窃取,该答案引用了Howard Hinnant的演讲中的一张桌子。
这里的道理是,好的做法是不要依赖编译器的隐式声明,而不必显式声明每个特殊成员(默认还是删除,具体取决于您的需要)
“有没有办法列出特定类的编译器生成的函数?”
当然有。在Linux的(和其他Unix系统),可以使用nm
,readelf
并且objdump
所生成的目标文件/库/可执行拆卸他们和检查任何导出的符号(以及更多)。
我知道Windows上有类似的工具,但是那不是我经常使用的平台,因此很遗憾,我无法在其中命名确切的工具名称。
目前这只是部分答案。
定义类对象时,Visual Studio的IntelliSense函数显示可用的构造函数,包括编译器生成的和您自己的:
不幸的是,此信息并不总是出现。为了使其适用于上面的屏幕截图,我必须在括号中键入一些内容,因此要输入逗号。