考虑到签名者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 标准组织,或微软的错误报告?
答案 0 :(得分:3)
我不记得在采用tr1::regex
或std::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<...>&&
),这会产生一个很好的编译错误,而不是这个运行时错误。但是,库规范不包括那些重载,我没有看到这方面的缺陷报告。