gpt4 book ai didi

c++ - 是否可以在按值捕获后检测异常切片?

转载 作者:太空狗 更新时间:2023-10-29 21:01:47 35 4
gpt4 key购买 nike

Andrei Alexandrescu 最后发表讲话C++ and Beyond regarding systematic error handling .我喜欢 Expected 模板模式并将其改编为 Visual Studio 2010,因为编译器目前不支持扩展 union 。所以我写了一个 UnitTest 来检查一切是否正常。然后我到了我想检查切片异常的检测是否有效的地步。但它没有。

我不想在这里粘贴完整的代码,所以我试图减少它的重点:

#include <iostream>
#include <string>
#include <exception>
#include <typeinfo>

class MyException : public std::exception
{
public:
MyException()
: std::exception()
{}
virtual const char* what() const { return "I come from MyException"; }
};

void hereHappensTheFailure()
{
throw MyException();
}

template <class E>
void detector(const E& exception)
{
if (typeid(exception) != typeid(E))
{
std::cout << "Exception was sliced" << std::endl;
}
else
{
std::cout << "Exception was not sliced" << std::endl;
}
}

int main()
{
try
{
hereHappensTheFailure();
}
catch (std::exception ex) // intentionally catch by value to provoke the problem
{
detector(ex);
}

return 0;
}

但是没有检测到切片。那么我的测试是否有错误,这不适用于 VS2010 还是该模式最后不起作用? (刚刚编辑,因为 ideone 上的 gcc 4.7.2 不喜欢它)非常感谢!

最佳答案

你的逻辑不正确。切片将异常从 MyException 转换为 std::exception。由于您让模板自动检测类型,因此它会选择与参数相同的类型 - 它保证是相同的。

改为这样调用它:

detector<MyException>(ex);

关于c++ - 是否可以在按值捕获后检测异常切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17221407/

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