【发布时间】:2015-05-23 15:09:30
【问题描述】:
#include <iostream>
using namespace std;
struct CL
{
CL()
{
cout<<"CL()"<<endl;
}
CL(const CL&)
{
cout<<"CL(const CL&)"<<endl;
}
~CL()
{
cout<<"~CL()"<<endl;
}
};
CL cl;
CL fnc()
{
return cl;
}
int main() {
cout<<"start"<<endl;
const CL& ref=static_cast<const CL&>(fnc());
//...Is "ref" valid here??
cout<<"end"<<endl;
return 0;
}
fnc() 返回的临时对象的生命周期是多少?是“ref”的生命周期还是临时引用 static_cast(fnc()) 的生命周期,在语句结束时销毁?
gcc 的输出(fnc() 的生命周期是“ref”的生命周期):
CL() //global object "cl"
start
CL(const CL&)
end
~CL()
~CL() //global object "cl"
VS2013 的输出(fnc() 的生命周期是临时引用的生命周期):
CL() //global object "cl"
start
CL(const CL&)
~CL()
end
~CL() //global object "cl"
标准中什么是正确的?
【问题讨论】:
-
只是想知道,如果删除
static_cast<>会发生什么?我希望两者的行为相同,以防万一您有真正想要解决的问题。另外,您对这个问题的标准有何解释? -
@UlrichEckhardt
static_cast是这里与众不同的地方。没有它,fnc()的生命周期保证会延长到ref的生命周期。 -
谢谢,@Angew。我知道这是它必须的行为方式,但我只是想确认这个无可争议的规则得到正确实施。
-
@Jean-BaptisteYunès 不是重复的,它不涵盖此问题中提出的问题。
标签: c++ reference language-lawyer temporary-objects