throw obj
总是会发生复制(copy constructor
),复制总是以对象静态类型为本。
谨慎使用throw-by-pointer
,因为pointer
可能指向局部对象,在离开scope时结果不可预期。
try
{
//...
throw some_obj; // (1)
}
catch(Obj obj) // (2)
{
throw obj; // (3)
}
catch(Obj& obj) // (4)
{
throw obj; // (5)
}
catch(const Obj& obj) // (6)
{
throw; // (7)
}
some_obj
被复制,离开scopeobj
是一个副本obj
被复制,同(1),对象类型为其静态类型obj
是exception的引用- 与(3)相同
- 与(4)相同
throw
将obj
抛出,不发生复制(保持exception
类型)