このコードが機能する理由を理解できません。私はしばらくの間 C# の世界にいましたが、RValue Refs やムーブ セマンティクスなどの C++11 の新しい機能に飛び込む前に、C/C++ をブラッシュ アップしたいと考えていました。
私が書いたこのコードがなぜ機能するのか疑問に思っています:
class InnerMember
{
    private:
        int _iValue;
    public:
        InnerMember(): _iValue(0) {};
        InnerMember(int iValue) : _iValue (iValue) {};
        int GetValue(void) { return _iValue; }
        int SetValue(int iValue) { _iValue = iValue; }
};
class TestClass
{
    private:
        InnerMember _objValue;
    public:
        TestClass() : _objValue(1) {};
        void SetValue(int iValue)
        {
            _objValue.SetValue(iValue);
        }
        InnerMember& GetRef(void)
        {
            return _objValue;
        }
        virtual ~TestClass() { std::cout << "I've been released!" << std::endl; }
};
int main (int argc, char *argv[])
{
    TestClass* pobjTest = new TestClass();
    std::cout << "Before:" << std::endl;
    std::cout << pobjTest->GetRef().GetValue() << std::endl;
    pobjTest->SetValue(5);
    InnerMember& robjInner = pobjTest->GetRef();
    delete pobjTest;
    std::cout << "After:" << std::endl;
    std::cout << robjInner.GetValue();
    return 0;
}
出力は次のとおりです。
Before:
1
I've been released!
After:
5
Press any key to continue...
TestClass が破棄された後、TestClass から参照先の InnerMember にアクセスするので、これはエラーになると思いました。ある種の戻り値の最適化が行われていますか? それとも、参照を返すのではなく、本当にコピーを返していますか?
最適化なし (-O0) で GCC を使用しましたが、問題なく動作しました。
また、-S スイッチを使用してアセンブリを生成しましたが、AMD64 の知識が不足しており、名前の変更は役に立ちませんでした。