从C ++ 11开始,<regex>
标头定义函数std::regex_match
,std::regex_search
并std::regex_replace
在§28.11中。我猜有一个合理的理由不要使用这些函数noexcept
,但是我找不到关于这些函数可能抛出的内容或原因的任何参考。
regex_match(anyString, regex("."))
异常,例如,它是否确保不会抛出异常?PS:由于其中一些异常可能继承自std::runtime_error
,因此它们可能std::bad_alloc
在构造过程中抛出。
C ++ 11§28.6状态
该类
regex_error
定义了作为异常抛出的对象的类型,以报告正则表达式库中的错误。
这意味着<regex>
库不应自己抛出其他任何内容。您是正确的,因为内存不足条件,在构造过程中可能会引发regex_error
从继承的构造,因此您还必须在错误处理代码中进行检查。不幸的是,这使得无法确定实际抛出的构造。runtime_error
bad_alloc
regex_error
bad_alloc
对于§28.11正则表达式算法,它是在说§28.11.1那
本节中描述的算法可能会引发type异常
regex_error
。如果e
抛出此类异常,e.code()
则应返回regex_constants::error_complexity
或regex_-constants::error_stack
。
这意味着,如果第28.11节中的函数抛出a regex_error
,则它将保留这些代码之一,而别无其他。但是,还请注意,传递给<regex>
库的内容(例如分配器等)也可能会抛出,例如,match_results
如果将结果添加到给定match_results
容器中,则其分配器可能会触发。另请注意,第28.11节具有一些“仿佛”构造的简写函数match_results
,例如
template <class BidirectionalIterator, class charT, class traits>
bool regex_match(BidirectionalIterator first, BidirectionalIterator last,
const basic_regex<charT, traits> & e,
regex_constants::match_flag_type flags =
regex_constants::match_default);
template <class BidirectionalIterator, class charT, class traits>
bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
const basic_regex<charT, traits> & e,
regex_constants::match_flag_type flags =
regex_constants::match_default);
可能还有其他。由于这样可能会match_results
在allocator
内部构造并与标准一起使用,因此它们可能会抛出任何std::allocator
异常。因此,regex_match(anyString, regex("."))
由于默认分配器的构造和使用,您的简单示例也可能抛出。
另一个需要注意的注意事项是,对于某些<regex>
函数和类,当前无法确定abad_alloc
是由某些分配器抛出还是在构造regex_error
异常期间抛出。
通常,如果您需要更好的异常规范,请避免使用<regex>
。如果您需要简单的模式匹配,则最好使用自己的安全match / search / replace函数,因为不可能约束您的正则表达式以可移植或前向兼容的方式避免这些异常,即使使用空的正则表达式也是如此。""
可能会给你一个例外。
PS:请注意,C ++ 11标准在某些方面写得很差,缺少完整的交叉引用。例如,在条款下没有明确声明match_results
可以扔东西的方法,而§28.10.1.1指出(强调我的意思):
在所有
match_results
构造函数中,参数的副本Allocator
应用于对象的生存期内构造函数或成员函数执行的任何内存分配。
因此,像律师一样浏览标准时请多加注意!;-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句