有些情况:
案例1:
string("test");
int i = 1;
这是一个临时对象。它会在我们到达int i = 1;
后立即被破坏。我是对的吗?
案例2:
const char * p = string("test").c_str();
int i = 1;
cout<< p;
我认为当我们到达int i = 1;
时,p会指出非法记忆。但我总是cout
正确的字符串。我很幸运,或者p不是非法的?
案例3:
void fun()
{
throw Exception("error");
}
int main()
{
try
{
fun();
}catch(const Exception & e)
{
cout << e.description();
}
}
我们可以throw
一个函数中的临时对象,并使用const引用在其更高级别的函数中捕获它吗?
答案 0 :(得分:4)
在案例1和案例2中,一旦评估了它的完整表达式,就会破坏临时对象。在案例1中,当陈述结束时。
在案例2中,没有你不幸运,它的未定义的行为并且似乎正在工作只是其中之一UB的可能性。
对于案例3,C ++本身将确保整个异常处理都有一个有效的实例,异常处理程序可以引用该实际的实例。
答案 1 :(得分:0)
何时被破坏的临时对象
完整表达完成后。
案例1:
的字符串(&#34;测试&#34); int i = 1;这是一个临时对象。这将是 我们到达时i = 1;我是对的吗?
是
案例2:
const char * p = string(&#34; test&#34;)。c_str(); int i = 1; COUT&LT;&LT;磷;我认为 当我们到达i = 1时,p将指向非法存储器。
是的,它会
但我可以 总是cout正确的字符串。我很幸运,或者p不是非法的?
因为在std :: cout的情况下,完整表达式仅在分号后完成。
我们可以在函数中抛出一个临时对象,并使用const引用在其更高级别的函数中捕获它吗?
是的,你可以:This链接对异常对象生命周期有一个很好的解释。我认为异常表达式在捕获异常时结束(但这只是一种思考它的方式)。