请注意以下代码:
如果按照现有代码运行,我们会得到:
考虑以下代码段:
class C1
{ public:
C1(){ cout<<"CONSTR WAS HERE"<<endl; }
C1(const C1&ob){ cout<<"COPY CONSTR WAS HERE"<<endl; }
~C1(){ cout<<"DESTR WAS HERE"<<endl; }
}
void f1(C1 x){ }
int main()
{
C1 c1;
f1(c1);
}
如果按照现有代码运行,我们会得到:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
从我的角度来看,这是完全可以理解的。但是,如果我们将函数"f1"修改为:
C1 f1(C1 x){ }
而不是
void f1(C1 x){ }
我们会得到:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
我不太确定原因是什么。
C1 f1(C1 x){ }
函数实际上没有返回值,因此它具有未定义的行为。 - AndyGvoid
),那么这个函数 必须 返回某些东西,否则你将会有未定义行为(这会使你的程序不合法和无效)。对于任何具有 UB 的程序行为进行推测都是没有意义的。 - Some programmer dude