为什么在此代码中未调用复制构造函数

nik*_*nik 0 c++ copy-constructor

那么为什么不能在“ const Integer operator +(const Integer&rv) ”函数中调用Copy构造函数。是因为RVO。如果是,我需要采取什么措施来防止这种情况发生?

#include <iostream>

using namespace std;

class Integer {
    int i;

public:
    Integer(int ii = 0) : i(ii) {
        cout << "Integer()" << endl;
    }

    Integer(const Integer &I) {
        cout << "Integer(const Integer &)" << endl;
    }

    ~Integer() {
        cout << "~Integer()" << endl;
    }

    const Integer operator+(const Integer &rv) const {
        cout << "operator+" << endl;
        Integer I(i + rv.i);
        I.print();
        return I;
    }

    Integer &operator+=(const Integer &rv) {
        cout << "operator+=" << endl;
        i + rv.i;
        return *this;
    }

    void print() {
        cout << "i: " << i << endl;
    }
};

int main() {
    cout << "built-in tpes:" << endl;
    int i = 1, j = 2, k = 3;
    k += i + j;
    cout << "user-defined types:" << endl;
    Integer ii(1), jj(2), kk(3);
    kk += ii + jj;

}
Run Code Online (Sandbox Code Playgroud)

如果注释掉副本构造函数,我确实会出错。我期望在operator +返回时调用复制构造函数。以下是程序的输出

built-in tpes:
user-defined types:
Integer()
Integer()
Integer()
operator+
Integer()
i: 3 // EXPECTING Copy Constructor to be called after this
operator+=
~Integer()
~Integer()
~Integer()
~Integer()
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 5

是因为RVO。如果是,我需要采取什么措施来防止这种情况发生?

是。但是由于编译器的“ 返回值优化”而未调用它。

如果您使用的是GCC,请使用-fno-elide-constructorsoption来避免。

GCC 4.6.1手册说,

-fno-elide的构造函数

C ++标准允许实现省略创建仅用于初始化相同类型的另一个对象的临时操作。指定此选项将禁用该优化,并在所有情况下强制G ++调用复制构造函数。