对std :: regex_match(和std :: regex_search)参数生命周期的约束

时间:2012-08-16 16:52:31

标签: c++ c++11

考虑到签名者std::regex_match( std::string const&, std::smatch& match, std::regex const& re )的C ++ 11功能,是什么 是第一个参数的生命周期的约束?我找不到 任何,但当我执行以下程序(用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_match中的m只能保留 迭代器进入字符串,而不是副本。我找不到任何东西 禁止我的代码的标准。

FWIW:它在boost::regex中也不起作用,这就是 std::regex基于。 (当然,Boost没有记录任何内容 关于生命周期的约束。)

最后,我想我的问题是:我应该向DR发送一个DR 标准组织,或微软的错误报告?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

regex_match的此重载规范说明了它(28.11.2 [re.alg.match] / 6):

  

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

对此重载没有其他要求,并且它所委托的重载只占用迭代器范围 - 没有办法让临时字符串保持活动状态,因为它甚至不知道有一个字符串保持活力。

STL'sregex presentation at C++Now '12期间讨论了这个问题。有人建议可以在规范中添加额外的重载,以捕获rvalue字符串参数(例如basic_string<...>&&),这会产生一个很好的编译错误,而不是这个运行时错误。但是,库规范不包括那些重载,我没有看到这方面的缺陷报告。