是的,把一个临时值作为引用抛出会导致未定义行为。正确的做法是将该值存储在一个对象中,然后将该对象作为引用抛出。以下是一个简单的示例代码:
#include
class A {
public:
A(int x): data(x) {}
int& get_data() { return data; }
private:
int data;
};
void foo() {
throw A(42); // 不能抛出A(42).get_data()的结果
}
int main() {
try {
foo();
} catch (A& a) {
std::cout << a.get_data() << std::endl;
}
return 0;
}
在上面的示例代码中,我们创建了一个名为A的对象,用于存储值,然后在抛出时将A对象的引用作为异常。在catch块中,我们可以通过调用A对象的get_data函数来访问该值。