对临时对象进行哪些操作可以防止其寿命延长



如您所知,在C++中,如果临时对象绑定到本地引用,则临时对象的生存期将延长到作用域结束。

但是,如果用临时或其他操作执行强制转换,会发生什么,例如:

#include <iostream>
struct S
{
virtual ~S() { std::cout << "~S() "; }
};
struct U : S {};
int main() 
{
// this temporary is destroyed in this line in GCC, and at the end in Clang
[[maybe_unused]] auto && u = dynamic_cast<const U&>( static_cast<const S&>( U{} ) );
std::cout << ". ";
// this temporary is destroyed in this line in Clang, and at the end in GCC
[[maybe_unused]] auto && s =  *&static_cast<const S&>( S{} );
std::cout << ". ";
}

这里很明显,us都引用了相应的临时对象,但Clang和GCC只延长了其中一个临时对象的寿命,并且不同意哪一个:https://gcc.godbolt.org/z/onWKaq8MG

两个编译器是否都在其权限范围内,或者其中一个编译器(或两者(的行为不正确?

我认为Clang是正确的。

第一种情况下的临时人员的使用寿命应延长。

  • const_cast、static_cast、dynamic_cast或repret_cast转换,如果没有将这些表达式之一转换为glvalue的用户定义转换,则指的是操作数指定的对象,或其完整对象或子对象(显式强制转换表达式被解释为这些强制转换的序列(

这里没有用户定义的转换,应该延长生存期。

对于第二种情况,表达式*&...不包括在延长寿命的情况中,临时表达式应在完整表达式之后立即销毁。

BTW:Gcc似乎只与dynamic_cast表现不同。将第一种情况下的dynamic_cast更改为static_castreinterpret_cast或c样式的转换寿命将延长。

最新更新