`regex_match` 返回 'not found' 和 `match_results`

Too*_*sie 7 c++ regex c++11

在以下代码(gcc 10.2.1)中,调用regex_match返回“不匹配”,我认为这是正确的。

sm.size()返回0,但是当从sm.begin()to迭代时end(),它找到了 3 次出现(都是空字符串)。

如果这是正确的,这三个发现是什么意思?

但既然size()==0,不应该begin() == end()吗?

编辑:根据评论,我ready在输出中添加了标志

#include <iostream>
#include <string>
#include <regex>
#include <assert.h>

int main()
{
    std::string input("4321");
    std::regex rg("^([0-9])");
    std::smatch sm;

    bool found = std::regex_match(input, sm, rg);

    assert(!sm.size() == sm.empty());

     std::cout << "ready: " << sm.ready() << ", found: " <<
          found << ", size: " << sm.size() << std::endl;


    for (auto it = sm.begin(); it != sm.end(); ++it)
    {
        std::cout << "iterate '" << *it << "'\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

ready: 1, found: 0, size: 0
iterate ''
iterate ''
iterate ''
Run Code Online (Sandbox Code Playgroud)

Jon*_*ely 4

在GCC的实现中,前缀、后缀和不匹配的字符串存储在对象(作为私有基类实现)match_results管理的序列的末尾。从to迭代时,这些额外的元素不应该是可见的,但该函数返回了错误的位置。它在三个额外元素之后返回一个到向量末尾的迭代器。它应该在那些之前返回一个迭代器,它等于。match_resultsstd::vectorbegin()end()end()begin()

显然,这是一个错误。我会解决它。

修复方法是:

       const_iterator
       end() const noexcept
-      { return _Base_type::end() - (empty() ? 0 : 3); }
+      { return _Base_type::end() - (_Base_type::empty() ? 0 : 3); }
Run Code Online (Sandbox Code Playgroud)