假设我有以下代码。第一个try-catch的行为符合预期。我得到了一个问候"相反,第二次尝试捕获报告捕获0x501da8(指针)。 在第二种情况下,创建临时字符串流子类。在它的析构函数中(因此在解构base base string之前)我调用底层stringstream的str,并使用它来创建runtime_error。为什么代码在第二种情况下不起作用? (使用-fno-elide-constructors进行编译没有区别)
#include <sstream>
#include <iostream>
#include <stdexcept>
class S:public std::stringstream{
public:
~S(){
throw std::runtime_error(str());
}
};
void f(){
S a;
a<<"hello";
}
void g(){
S()<<"hello";
}
int main(){
try{
f();
}catch(std::runtime_error& b){
std::cout<<"caught "<<b.what()<<std::endl;
}
try{
g();
}catch(std::runtime_error& b){
std::cout<<"caught "<<b.what()<<std::endl;
}
}
这些想法如下。创建一个&#34;异常流&#34;其中我&lt;&lt;所有的错误细节,让析构函数抛出(所以我确信我创建流后不会忘记抛出)。像if (failcondition){ S()<<"some error "<<someinfo; }
之类的东西有没有办法正确实现这种行为?