避免异常处理中的副本

use*_*541 2 c++ exception-handling

我可以通过以下方式避免复制对象吗?

MyClass Obj;

try {
    throw &Obj;
}
catch(MyClass *a) {

}
Run Code Online (Sandbox Code Playgroud)

小智 10

如果对象太昂贵而无法复制,则不应将其作为异常抛出 - 完全停止.异常类应该相当简单和轻量级.并且你应该总是通过引用捕获异常(可能通过const引用) - 捕获指针是坏的风格.所以你的代码应该写得更好:

try {
    throw MyClass();
}
catch( const MyClass & a) {
}
Run Code Online (Sandbox Code Playgroud)

回应你的评论,这个:

struct A {
    A() {}
    private:
    A( const A & ) {}
};

int main() {
    throw A();
}
Run Code Online (Sandbox Code Playgroud)

应该是一个错误.但是你根本不应该禁止复制你想要抛出的类作为例外 - 你为什么要这样做?