繁体   English   中英

为什么我不能在异常 class 中有 auto_ptr

[英]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_castmutable来允许它复制auto_ptr来从const引用进行初始化 - 但这有潜在的危险,我不会推荐它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM