Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量引用到临时引用_C++_Reference_Language Lawyer_Temporary Objects - Fatal编程技术网

C++ 常量引用到临时引用

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

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();
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());