gpt4 book ai didi

c++ - 对 std::runtime_error 的 what() 函数的误解

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:28 25 4
gpt4 key购买 nike

我测试了 Boost.Exception 库并遇到了莫名其妙的行为。接下来两个样本的输出不同。

#include <iostream>
#include <boost/exception/all.hpp>

typedef boost::error_info<struct tag_my, std::runtime_error> my_info;
struct my_error : virtual boost::exception, virtual std::exception {};

void foo () { throw std::runtime_error("oops!"); }

int main() {
try {
try { foo(); }
catch (const std::runtime_error &e) {
throw my_error() << my_info(e);
}
}
catch (const boost::exception& be) {
if (const std::runtime_error *pe = boost::get_error_info<my_info>(be))
std::cout << "boost error raised: " << pe->what() << std::endl;
}
}

//output
//boost error raised: oops!

当我将 std::runtime_error 更改为 std::exception 时,我得到了以下内容

#include <iostream>
#include <boost/exception/all.hpp>

typedef boost::error_info<struct tag_my, std::exception> my_info;
struct my_error : virtual boost::exception, virtual std::exception {};

void foo () { throw std::runtime_error("oops!"); }

int main() {
try {
try { foo(); }
catch (const std::exception &e) {
throw my_error() << my_info(e);
}
}
catch (const boost::exception& be) {
if (const std::exception *pe = boost::get_error_info<my_info>(be))
std::cout << "boost error raised: " << pe->what() << std::endl;
}
}

//output
//boost error raised: std::exception

为什么第二个样本会生成它的输出?

最佳答案

对象切片。 boost::error_info 复制对象。因此,第二个示例从 std::runtime_exception 的基类复制构造 std::exception,在此过程中丢失了消息。

std::exception 没有任何方法来存储自定义消息;它的 what() 实现只是返回一个硬编码的字符串。

关于c++ - 对 std::runtime_error 的 what() 函数的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21907801/

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