C++编译器如何合成默认的拷贝构造函数

标签 c++ copy-constructor

编译器合成的默认复制构造函数 一个没有定义自己的类做正确的事:它复制 从一个对象到另一个对象的所有成员。

我想做类似的事情。我想写一个方法

template <typename T>
T f(const T& obj) {
 // for each member var i of obj, I want to call some method g(obj.i)
}

现在我不知道成员变量的名称是什么。如果这是 复制构造函数,我可以调用赋值运算符而不是 g。

很明显,编译器会这样做(但也许它是在推断出 类(class)成员的姓名)。甚至有可能做到这一点 对于任何类 T?

最佳答案

编译器有一些代表每个类的内部数据结构。当涉及到复制构造函数的合成时,它可以引用这个结构来弄清楚它需要发出什么代码(多少个拷贝,每个拷贝是如何完成的,以及成员的地址与源代码的关系)和目标对象地址)。

作为单纯的 C++ 程序员,您无权访问此内部编译时数据结构,因此您很不走运。您基本上必须列出成员,并希望您不要遗漏任何成员。

您或许可以使用预处理器(或者如果不是the 预处理器,那么<​​em>a 预处理器),使用可用于生成的额外信息注释您的结构定义每个成员的一个调用列表。

关于C++编译器如何合成默认的拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398447/

相关文章:

c++ - 制作打印所有变量名称和值的可变参数宏/方法

c++ - 局部变量和作为参数传递的变量

c++ - 默认复制构造函数和复杂的继承层次

c++ - 'explicit' 关键字对返回值优化 (RVO) 有何影响?

c++ - 如果第一个相同,则按第二个排序插入成对的 STL 集合

c++ - MessageBox 上的 Visual Studio 2015 WinAPI 错误

c++ - 断言为好友类

c++ - Ray-Box 相交法线

c++ - 复制构造函数调用 C++

c++ - 基于 bool 模板参数的重载