重複の可能性:
変更可能なメンバーを返すには?
割り当て (および呼び出されたメソッド シグネチャ) で const& を使用すると、被参照オブジェクトの有効期間がメソッドの最後まで延長されることを学びます。
Employee const& getEmp(int a) {
return Employee(a);
}
Employee const& tmpEmp = m.getEmp(10); //
... stuff
//end of scope - tmpEmp valid until here
私は小さなプログラムを書き、それが期待通りに動作することを確認しました。私の質問は、これを行う方法ではありませんか?私の質問は、コンパイラがこれをどのように行うかについてです。例を見るとreturnの直後にデストラクタが呼ばれるので、どうやってデストラクタを呼んだのだろうと思うのですが、tmpEmpはデストラクタを呼んだ後に有効なのですか?
#include <iostream>
using namespace std;
class Employee {
public:
Employee() : a(0){
cout << "c-emp" << a << endl;
}
Employee(const Employee& newE) {
a = newE.a;
cout << "c-c-emp" << a << endl;
}
Employee(int a) : a(a) {
cout << "c-emp" << a << endl;
}
~Employee() {
cout << "d-emp" << a << endl;
}
int a;
};
class Manager {
public:
Manager() {}
~Manager() {}
Employee const& getEmp(int a) {
return Employee(a);
}
};
int main(int argc, char **argv) {
Manager m;
Employee const& tmpEmp = m.getEmp(10);
cout << "tmpEmp " << tmpEmp.a <<endl;
}
output:
c-emp10
d-emp10 - destructor is called and tmpEmp is still valid? how is that?
tmpEmp 10