[英]Why can't I have an auto_ptr in an Exception class
我在 Exception 类中遇到 auto_ptr 的问题,我最终将其简化为:
#include <memory>
class MyException
{
std::auto_ptr<int> m_foo2;
};
int main()
{
try
{
throw MyException();
}
catch (const MyException&)
{
}
return 0;
}
这无法编译:
/perforce/unstable/test/Common/Exceptions/TestException4.cpp: 在 function 'int main()': /perforce/unstable/test/Common/Exceptions/TestException4.cpp:12: error: 没有匹配的 function 调用 ' MyException::MyException(MyException)' /perforce/unstable/test/Common/Exceptions/TestException4.cpp:4: 注意:候选人是:MyException::MyException() /perforce/unstable/test/Common/Exceptions/TestException4.cpp :4: 注意: MyException::MyException(MyException&) /perforce/unstable/test/Common/Exceptions/TestException4.cpp:12: 错误: 在抛出的表达式中
如果我删除 auto_ptr,错误就会消失。
这是因为正在复制或分配异常吗? 有没有办法在异常中使用auto_ptr
?
这是因为正在复制或分配异常吗?
它的确是。 C++11 15.1/3标准规定了如何抛出异常:
抛出表达式初始化一个临时的 object,[...]。 临时变量是一个左值,用于初始化匹配处理程序中命名的变量。
初始化是使用隐式复制构造函数完成的。 这被声明为MyException(MyException&)
,因为有一个成员需要非const
引用参数(如 C++11 12.8/9 中所指定)。 临时 object 不能绑定到非const
引用,因此构造失败。
有没有办法在异常中使用 auto_ptr?
如果您能够使用 C++11,那么您可以改用unique_ptr
,并将auto_ptr
委托给历史。 您的 class 将有一个隐式移动构造函数,声明为MyException(MyException&&)
,可用于从临时初始化它。
否则,您可以抛出一个非临时值:
MyException ex;
throw ex;
或者你可以破解你的 class 以允许通过添加显式复制构造函数并使用const_cast
或mutable
来允许它复制auto_ptr
来从const
引用进行初始化 - 但这有潜在的危险,我不会推荐它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.