以下のコードは、関数で作成されたオブジェクトの有効期間が で作成されたオブジェクトの有効期間に延長create()
されることを示していますが、これはすべての場合で正しいですか? 一時的な参照を作成することで、特定の場合に一時的な寿命を延ばすことができるということですか? または、この特定のケースでは、コンパイラは誤動作していますか?const ref
main
MSVC2005でコンパイルされています
#include <iostream>
class testClass
{
public:
testClass()
{
std::cout << "in testClass " << ((void*)this) << std::endl;
}
~testClass()
{
std::cout << "in ~testClass " << ((void*)this) << std::endl;
}
};
testClass create()
{
return testClass();
}
int main()
{
{
testClass const& obj = create();
std::cout << "we got a const reference to obj " << ((void*)&obj) << std::endl;
}
return 0;
}
出力
in testClass 0018FF13
we got a const reference to obj 0018FF13
in ~testClass 0018FF13
もちろん、他のアドレスは異なる場合があります...上記の場合、関数create()
で作成されたオブジェクトのデストラクタを期待していましたが、行の前に呼び出されます
std::cout << "we got a const reference to obj " << ((void*)&obj) << std::endl;
実行されます。