C++ 常量引用到临时引用
VS2013的输出(fnc()的生存期是临时引用的生存期):C++ 常量引用到临时引用,c++,reference,language-lawyer,temporary-objects,C++,Reference,Language Lawyer,Temporary Objects,VS2013的输出(fnc()的生存期是临时引用的生存期): 标准上什么是正确的?我认为Visual Studio在这里是正确的,其中包括: 在这样的声明中 CL() //global object "cl" start CL(const CL&) ~CL() end ~CL() //global object "cl" 答复是: 本期是第1376期的副本 因此,在这种情况下: struct S { }; const S& r = (const S&)S(); co
标准上什么是正确的?我认为Visual Studio在这里是正确的,其中包括: 在这样的声明中
CL() //global object "cl"
start
CL(const CL&)
~CL()
end
~CL() //global object "cl"
答复是:
本期是第1376期的副本
因此,在这种情况下:
struct S { };
const S& r = (const S&)S();
const CL&ref=static_cast(fnc());
该引用绑定到static_cast
的结果,而不是CL
,因此CL
是一个悬空引用
参考C++11标准草案第5.2.9节[expr.static.cast]中的相关文本:
否则,可以使用static形式的static_强制转换将表达式e显式转换为类型T_-
如果声明为T(e),则为cast(e);对于一些发明的临时变量t(8.5),它的形式是良好的。这个
这种显式转换的效果与执行声明和初始化,然后
使用临时变量作为转换的结果。表达式e用作GLF值,如果和
仅当初始化将其用作glvalue时
可能重复刚才的疑问,如果删除
static\u cast
,会发生什么?我希望两人的行为都一样,以防万一你有一个真正的问题要解决。另外,你对这个问题的标准有什么解释?@UlrichEckhardt静态演员阵容
是这里所有不同之处。如果没有它,fnc()
的寿命将保证延长到ref
的寿命。谢谢,@Angew。我知道这是它必须的行为方式,但我只是想确认这条无可争议的规则是否得到了正确的实施。@Jean BaptisteYunès这不是重复的,它没有涵盖在这个问题中提出的问题。DR1376的解决方案没有出现在C++17中,所以这个故事似乎有更多内容;我不清楚由static\u cast
实现的临时对象的生命周期是什么。如果它相当于绑定到声明的结果tt(e)
,那么T
将持续到当前块的末尾(当前版本的g++和clang实际上都是这样做的)
CL() //global object "cl"
start
CL(const CL&)
~CL()
end
~CL() //global object "cl"
T&& r = static_cast<T&&>(T());
struct S { };
const S& r = (const S&)S();
const CL& ref=static_cast<const CL&>(fnc());