关于:C++中异常对象的范围:为什么我没有得到副本?
about : Scope of exception object in C++ : why don't I get the copy?
关于异常范围的问题,由Aj声明。throw和catch子句将创建异常的副本(我想除非使用引用(
我试了一个小玩具代码,但我不明白结果。此处:
//g++ 7.4.0
#include <iostream>
using namespace std;
struct Some_error {
Some_error(float code):err_code(code){ cout << "Some_error(" << err_code << ")n"; }
~Some_error() { cout << "~Some_error(" << err_code << ")n"; }
Some_error(const Some_error& o):err_code(o.err_code+0.1) { cout << "Some_error(copy::" << err_code << ")n"; }
Some_error(Some_error&& o):err_code(std::move(o.err_code)+.01){ cout << "Some_error(move::" << err_code << ")n"; }
int get_code() const { return err_code; }
private : float err_code;
};
int do_task() {
if ( false ) return 42; else throw Some_error {1};
cout << "end do_taskn" ;
}
void taskmaster(){
try { auto result = do_task(); cout << "the answer is " << result << "n" ; }
catch (Some_error e) { cout << "catch Some_error : " << e.get_code() << "n" ; }
cout << "end taskmastern" ;
}
int main() { taskmaster(); }
我得到的轨迹如下:
Some_error(1)
Some_error(copy::1.1)
catch Some_error : 1
~Some_error(1.1)
~Some_error(1)
end taskmaster
根据Aj的说法,首先,由于我在这里没有引用。,我希望能复制两份。
第二,有一个副本,它将err_code设置为1.1,但显示仍然是1。
备注:为了完整起见,我将catch更改为:catch(Some_error&e(,然后轨迹在我看来很好:
Some_error(1)
catch Some_error : 1
~Some_error(1)
end taskmaster
我预计会有两个副本。
为什么?catch
块只进行一次复制。第二次复制会发生在哪里?
将err_code设置为1.1,但显示仍然为1。
因为get_code
返回一个int
,所以浮点值会被截断。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 用callgrind追踪不必要的副本
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- C++基于范围的 for 循环和元素副本
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?