我无法理解为什么此代码有效。我在 C# 领域已经有一段时间了,想在深入研究 C++11 中的新东西(如 RValue Refs 和移动语义)之前复习 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。是否正在进行某种返回值优化?或者它真的返回一个副本而不是传回引用?
我使用 GCC 没有优化(-O0),它仍然运行没有问题。
我还使用了 -S 开关来生成程序集,但我的 AMD64 知识已经生疏,而且名称修饰也没有帮助。