可以将临时正则表达式对象传递给 regex_match 吗?

Is it okay to pass a temporary regex object to regex_match?

大多数使用 boost::regex_match 的示例在调用 match 之前构造 boost::regex 对象;例如

boost::regex pattern("(...)");
boost::smatch match;
if (boost::regex_match(text, match, pattern)) {
    // use the match object here
}

(有关其他示例,请参阅 https://github.com/boostorg/regex/tree/develop/example/snippets)。

但是,假设我改为将 临时 regex 对象传递给 regex_match,例如

boost::smatch match;
if (boost::regex_match(text, match, boost::regex("(...)"))) {
    // use the match object here
}

此代码有效吗?也就是说,boost::regex 对象是否需要与 boost::smatch 对象一样长,或者该生命周期要求是否仅适用于匹配的字符串?代码似乎工作正常,但我担心如果 smatch 对象在内部保留对用于匹配的正则表达式的引用,我可能 运行 会遇到麻烦。

我在 https://www.boost.org/doc/libs/1_79_0/libs/regex/doc/html/index.html 找不到明确记录的内容,但可能我错过了。

首先,从设计的角度来看,在 boost::smatch 中存储对 boost::regex 的引用是没有意义的。

查看 the implementation 确认:

template <class BidiIterator, class Allocator>
class match_results
{ 
   // ...

   vector_type            m_subs;                      // subexpressions
   BidiIterator   m_base;                              // where the search started from
   sub_match<BidiIterator> m_null;                     // a null match
   boost::shared_ptr<named_sub_type> m_named_subs;     // Shared copy of named subs in the regex object
   int m_last_closed_paren;                            // Last ) to be seen - used for formatting
   bool m_is_singular;                                 // True if our stored iterators are singular
};