请考虑以下代码。
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()
引用的对象是否会被破坏?
答案 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?