对于将 test3 改为 test3(Data data) 问题的描述,似乎不妥。
/*
编译错误:Copy constructor must pass its first argument by reference
参数列表中,若写的是一个对象,则在传参时,将调用其拷贝构造函数,那么问题就会出现:
我们将要调用的这个函数,就是拷贝构造函数,
所以,若在参数列表中,写一个对象的话,则在传参时,就会又调用一次拷贝构造函数,
然后在调用,从而陷入无限循环中去。
*/
Data(Data data);
上述「我们将要调用的这个函数,就是拷贝构造函数」是什么鬼?
说的是 test3(const Data& data) 吗?
先不说它根本就不是一个拷贝构造函数,仅仅是长得像而已。
这里你已经假设把 test3 改为了 test3(Data data) ,哪来的拷贝构造函数?
如果不是的话,那么「我们将要调用的这个函数,就是拷贝构造函数」,
是意思是在 test3(Data data) 函数体中调用 Data 的「拷贝构造函数」吗?