【发布时间】:2018-01-18 13:41:14
【问题描述】:
考虑以下代码:
class user_error : public std::runtime_error
{
public:
using std::exception::what;
explicit user_error(const std::string& what_arg):std::runtime_error(what_arg){}
};
class with_overriden_what : public user_error {
public:
with_overriden_what(const std::string& val) : user_error("user_error"), message(val) { }
std::string message;
virtual const char* what() const noexcept {
return message.c_str();
}
};
通过这个调用:
with_overriden_what ex("thrown");
std::cout << "1. direct result: " << ex.what() << "\n";
std::cout << "2. sliced result: " << static_cast<user_error>(ex).what() << "\n";
std::cout << "3. ranged result: " << ex.user_error::what() << "\n";
令我惊讶的是 2 和 3 的结果不同:
1. direct result: thrown
2. sliced result: user_error
3. ranged result: std::exception
问:标准中有一个段落可以解决这种行为吗?
【问题讨论】:
-
我在 VS 2017 中尝试过,结果不同(和预期):1. 直接结果:抛出 2. 切片结果:user_error 3. 范围结果:user_error 你使用哪个编译器?
-
2 或 3 中的哪一个是您期望两者的输出?
-
将
override添加到覆盖。 -
@R2RT ideone.com/QgCPXm
-
问题可以简化为:ideone.com/avu745。
what()和user_error::what()即使在user_error对象上调用时也会给出不同的结果。
标签: c++ language-lawyer using-declaration