gpt4 book ai didi

c++ - 如何在禁用异常的情况下检查构造函数的失败

转载 作者:行者123 更新时间:2023-11-30 03:36:45 25 4
gpt4 key购买 nike

在我们的代码库中,我们不使用 c++ 异常,即 gcc 编译选项中的“-fno-exceptions”(请注意这是我们公司的政策,因此无需争辩)。但是,在这种情况下,如何从抛出异常的标准库中检查构造函数的失败。我已经阅读了一些 SO 帖子,但仍然不清楚。例如,在 c++11 中,std::regex("pattern")可以抛出 regex_error 异常。如果我有以下代码:

class Wrapper {
public:
bool create(std::string pattern) {
try {
m_regex = std::regex(pattern);
m_state = true;
} catch (std::regex_error& e) {
//handle error case
m_state = false;
}
}
private:
std::regex m_regex;
bool m_state;
}

注意:m_regex = std::regex(pattern);

会打电话

explicit basic_regex(const CharT* s, flag_type f = std::regex_constants::ECMAScript)

可以抛出异常并移动赋值运算符

basic_regex& operator=(basic_regex&& __rhs) noexcept

现在,没有使用异常的选项,我们如何检查 std::regex 的构造函数的失败?

class Wrapper {
public:
create(std::string pattern) {
m_regex = std::regex(pattern);
// now, how to check?
// if (m_regex)?
m_state = true;
}
private:
std::regex m_regex;
}

我没有发现 std::regex 中有任何状态可以指示失败。

选项 1:我是否可以假设如果正则表达式构造函数失败,将发生 abort(),那么下面的语句 m_state = true 将不会被执行?我查了一下,似乎 abort() 通常在启用异常的情况下发生,但没有使用 catch。所以这是错误的。

选项 2:我可以使用 std::regex* ptr_regex = new std::regex("pattern"),并检查 ptr_regex 是否为空吗?

最佳答案

这是一个 Unresolved 问题,one of the big open problems discussed by SG14 ,委员会的“低延迟”研究组。

就标准而言,这根本就是未定义的。异常不是可选的,并且未指定如果关闭它们会发生什么。因此,标准库通常不提供处理错误的替代方法。目前有一种趋势是在未来的提案中稍微减轻这种情况。例如,当前的文件系统 TS 具有非抛出重载,可为所有可能抛出异常的函数返回错误代码。可能以类似的方式为现有的标准库设施提供非抛出替代方案,但这正是 SG14 正在努力解决的问题。

到目前为止,重要的问题是:您的编译器在遇到throw(或try/ catch) 在编译时禁用异常?如前所述,该标准根本没有指定这一点,因此这里的任何解决方案都必然是不可移植的。您可能无法通过 throw 检测到库指示的错误或从中恢复,因此如果您无法事先排除将抛出异常,您可能想要避开抛出函数(因此,大多数标准库)。

希望这种情况将来会有所改善。

关于c++ - 如何在禁用异常的情况下检查构造函数的失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40544915/

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