当使用表达式的结果初始化对象时,使用哪个构造函数 我有以下简单的C++代码: class X { public : int x ; X(int val) : x(val) {cout<<"one arg\n" ;} X(const X&xx) {cout<<"const copy constr\n" ; x = xx.x ;} X(X&xx) {cout<<"non const copy constr\n" ; x = xx.x ;} X(const X&&xx) {cout<<"const move constr\n" ; x = xx.x ;} X(X&&xx) {cout<<"non const move constr\n" ; x = xx.x ;} X operator +(X &ob) { X xx(x+ob.x) ; cout<<"add\n" ; return xx ; } X operator=(const X &x) {cout<<"const assign\n" ;} X operator=(X &x) {cout<<"non const assign\n" ;} X operator=(const X &&x) {cout<<"const move assign\n" ;} X operator=(X &&x) {cout<<"non const move assign\n" ;} } ; main() { X x1(10), x2(x1) ; cout<<"$$$$$$$$$$$$$$\n" ; X x3 = x1+x2 ;//does not invoke move/copy constr ---> do not know why cout<<"###########"<<x3.x<<endl ; cout<<"$$$$$$$$$$$$$$\n" ; vector<X> v ; v.push_back(X(100)) ;//invokes move constr X类{ 公众: int x; X(int val):X(val){cout

当使用表达式的结果初始化对象时,使用哪个构造函数 我有以下简单的C++代码: class X { public : int x ; X(int val) : x(val) {cout<<"one arg\n" ;} X(const X&xx) {cout<<"const copy constr\n" ; x = xx.x ;} X(X&xx) {cout<<"non const copy constr\n" ; x = xx.x ;} X(const X&&xx) {cout<<"const move constr\n" ; x = xx.x ;} X(X&&xx) {cout<<"non const move constr\n" ; x = xx.x ;} X operator +(X &ob) { X xx(x+ob.x) ; cout<<"add\n" ; return xx ; } X operator=(const X &x) {cout<<"const assign\n" ;} X operator=(X &x) {cout<<"non const assign\n" ;} X operator=(const X &&x) {cout<<"const move assign\n" ;} X operator=(X &&x) {cout<<"non const move assign\n" ;} } ; main() { X x1(10), x2(x1) ; cout<<"$$$$$$$$$$$$$$\n" ; X x3 = x1+x2 ;//does not invoke move/copy constr ---> do not know why cout<<"###########"<<x3.x<<endl ; cout<<"$$$$$$$$$$$$$$\n" ; vector<X> v ; v.push_back(X(100)) ;//invokes move constr X类{ 公众: int x; X(int val):X(val){cout,c++,C++,这个问题在stackoverflow上有无数个重复项,移动/复制被省略,请参见 正如GCC FAQ()中所述,当使用GCC(或clang)与-fno elide构造函数编译时,可以看到每个中间临时对象都被复制或移动,但是没有理由这样做,因为这会使程序速度慢得多 您观察到的是X内部的operator+是在为x3保留的堆栈位置构造的,因此不需要复制或移动,因为在正确的位置已经构造了具有正确值的X。如果您打印出xx的地址和addrx3的ess您将看到它们是同一个对象。stackoverflow上有无数

这个问题在stackoverflow上有无数个重复项,移动/复制被省略,请参见

正如GCC FAQ()中所述,当使用GCC(或clang)与
-fno elide构造函数编译时,可以看到每个中间临时对象都被复制或移动,但是没有理由这样做,因为这会使程序速度慢得多


您观察到的是
X
内部的
operator+
是在为
x3
保留的堆栈位置构造的,因此不需要复制或移动,因为在正确的位置已经构造了具有正确值的
X
。如果您打印出
xx
的地址和addr
x3的ess
您将看到它们是同一个对象。

stackoverflow上有无数个问题的副本,移动/复制被省略,请参阅

正如GCC FAQ()中所述,当使用GCC(或clang)与
-fno elide构造函数编译时,可以看到每个中间临时对象都被复制或移动,但是没有理由这样做,因为这会使程序速度慢得多


您观察到的是
X
内部的
operator+
是在为
x3
保留的堆栈位置构造的,因此不需要复制或移动,因为在正确的位置已经构造了具有正确值的
X
。如果您打印出
xx
的地址和addr
x3的ess
您将看到它们是相同的对象。

一个参数构造函数。//不调用move/copy-constr“我怀疑复制省略是原因。一个参数构造函数。//不调用move/copy-constr”我怀疑复制省略是原因。