是否绑定到本地引用的对象会自动销毁?

时间:2015-10-08 19:12:09

标签: c++ visual-c++

请考虑以下代码。

struct MyImage
{
    MyImage(const int handle);
    MyImage(const CString& filePath);
    virtual ~MyImage();

    void Process();
    void SaveAs(const CString& filePath);

    // No copying!
    MyImage(const MyImage& other) = delete;
    MyImage& operator=(const MyImage& other) = delete;
}

void ProcessImageFile(const CString& inFilePath, const CString& outFilePath)
{
    MyImage& image = MyImage(-1); // initialized with invalid handle

    if (DecryptionRequired())
    {
        const CString tempFilePath = ::GetTempFileName();
        Decrypt(inFilePath, tempFilePath);
        image = MyImage(tempFilePath);
        _tremove(tempFilePath);
    }
    else
    {
        image = MyImage(inFilePath);
    }

    image.Process();
    image.SaveAs(outFilePath);
}

image返回时,ProcessImageFile()引用的对象是否会被破坏?

1 个答案:

答案 0 :(得分:6)

MyImage& image = MyImage(-1); // initialized with invalid handle

不能编译,因为你不能对非临时变量采用非const引用。如果你有

const MyImage& image = MyImage(-1); // initialized with invalid handle

然后生命周期将延长,直到参考的生命周期结束。由于引用变量是自动对象,因此当它超出范围时,生命周期将结束。来自[basic.stc.auto]

  

显式声明寄存器或未显式声明为static或extern的块范围变量具有自动存储持续时间。这些实体的存储将持续到创建它们的块退出。

至于Visual Studio允许这样做的原因,请参阅Non-const reference bound to temporary, Visual Studio bug?