3

考虑到带有 signaturer 的 C++11 函数,std::regex_match( std::string const&, std::smatch& match, std::regex const& re )第一个参数的生命周期有什么限制?我没有找到任何东西,但是当我执行以下程序时(使用 VC++ 2010 编译,迭代器调试处于活动状态):

int
main()
{
    std::string a("aaa");
    std::string c("ccc");
    std::regex re("aaa(.*)ccc");
    std::smatch m;
    if (std::regex_match(a + "xyz" + c, m, re)) {
        std::cout << m[0] << std::endl;
        std::cout << m[1] << std::endl;
    }
    return 0;
}

它崩溃了,无疑是因为sub_matchinm只将迭代器保留在字符串中,而不是副本。我在标准中找不到任何禁止我的代码的内容。

FWIW:它也不起作用boost::regex,这就是它的 std::regex基础。(当然,Boost 也没有记录任何关于生命周期的限制。)

最后,我想我的问题是:我应该向标准组织发送 DR,还是向 Microsoft 发送错误报告?

4

2 回答 2

3

我不记得在采用tr1::regexor期间对这种可能性进行过任何讨论std::regex,所以我认为它根本没有被考虑。事后看来,这当然是一个我们应该预见到的陷阱。在我的脑海中,一个需要 a 的重载std::string&&将表明涉及临时性,并且需要一个副本。所以我会向标准委员会报告。(完全披露:我编写了 Dinkumware 实现,这是微软发布的)

于 2012-08-16T17:05:24.603 回答
1

这种重载的规范regex_match指出它(28.11.2[re.alg.match]/6):

回报: regex_match(s.begin(), s.end(), m, e, flags)

对这个重载没有额外的要求,它委托的重载只需要一个迭代器范围——它没有办法让临时字符串保持活动状态,因为它甚至不知道有一个字符串要保留活。

这个问题在STLregex在 C++Now '12 上的演讲中被讨论过。有人建议可以在规范中添加额外的重载,以捕获右值字符串参数(例如basic_string<...>&&),这将给出一个很好的编译错误而不是这个运行时错误。不过,库规范不包括这些重载,而且我没有看到这方面的缺陷报告。

于 2012-08-16T17:08:26.177 回答