gpt4 book ai didi

c++ - 为什么我不能在 Exception 类中有 auto_ptr

转载 作者:可可西里 更新时间:2023-11-01 18:28:40 25 4
gpt4 key购买 nike

我在异常类中遇到了 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: In function 'int main()': /perforce/unstable/test/Common/Exceptions/TestException4.cpp:12: error: no matching function for call to 'MyException::MyException(MyException)' /perforce/unstable/test/Common/Exceptions/TestException4.cpp:4: note: candidates are: MyException::MyException() /perforce/unstable/test/Common/Exceptions/TestException4.cpp:4: note: MyException::MyException(MyException&) /perforce/unstable/test/Common/Exceptions/TestException4.cpp:12: error: in thrown expression

如果我删除 auto_ptr,错误就会消失。

这是因为正在复制或分配异常吗?有没有办法在异常中使用 auto_ptr

最佳答案

Is this because the exception is being copied or assigned?

确实如此。该标准指定了 C++11 15.1/3 中如何抛出异常:

A throw-expression initializes a temporary object, [...]. The temporary is an lvalue and is used to initialize the variable named in the matching handler.

初始化是通过隐式复制构造函数完成的。这被声明为 MyException(MyException&),因为有一个成员需要非 const 引用参数(如 C++11 12.8/9 中所指定)。临时对象不能绑定(bind)到非 const 引用,因此构造失败。

Is there a way of using auto_ptrs in an Exception?

如果您能够使用 C++11,那么您可以改用 unique_ptr,并将 auto_ptr 交给历史。您的类将有一个隐式移动构造函数,声明为 MyException(MyException&&),可用于从临时初始化它。

否则,您可以抛出一个非临时值:

MyException ex;
throw ex;

或者您可以通过添加显式复制构造函数并使用 const_castmutable 来修改您的类以允许从 const 引用进行初始化复制 auto_ptr - 但这是潜在的危险,我不推荐它。

关于c++ - 为什么我不能在 Exception 类中有 auto_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10026938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com