为什么 MinGW 4.8 不将 ex.what() 视为虚拟
Why does MinGW 4.8 not treat ex.what() as virtual?
我正在使用Qt Creator 3.0.1和MinGW 4.8 32位作为编译器。
当我将以下代码放入main()
函数的最顶部(在Qt完成所有操作之前)时,我在控制台上得到的输出是"std::exception",而不是我期望的"Whoops":
try {
throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
std::cout << ex.what() << std::endl;
}
我还尝试通过指针访问what()
:
try {
throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
std::exception* ex2 = &ex;
std::cout << ex2->what() << std::endl;
}
在VS2013中编译的完全相同的代码输出"哎呀",正如我所期望的那样。
std::exception::what()
是虚拟的,那么为什么会这样呢?
正如克里斯所说,你正在切割信息。您可以通过捕获常量引用来防止这种情况(演示):
try {
throw std::logic_error{"Whoops"};
} catch (const std::exception& ex) {
std::cout << ex.what() << std::endl; // Whoops
}
相关文章:
- 虚拟决赛作为安全
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 什么是 std::exception::what() 以及为什么要使用它?
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- std::is_trivially_copyable_v 关于虚拟功能
- 为什么人们将虚拟关键字放在std :: exception :: what()的面前
- 为什么 MinGW 4.8 不将 ex.what() 视为虚拟
- std::exception 的 what() 方法不是虚拟的?