【发布时间】:2012-08-16 16:52:30
【问题描述】:
考虑带有签名者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;
}
它崩溃了,可能是因为m 中的sub_match 只保留
迭代器进入字符串,而不是副本。我在里面找不到任何东西
禁止我的代码的标准。
FWIW:它在 boost::regex 中也不起作用,这就是
std::regex 是基于。 (当然,Boost 没有记录任何
寿命方面的限制。)
最后,我想我的问题是:我应该发送 DR 到 标准组织,还是向 Microsoft 报告错误?
【问题讨论】:
-
我会发送 DR。现在,DR 中应该包含的内容是另一个问题。选项将只是记录或提供采用右值引用的重载,以便 看起来 正确的简单代码行为正确。 [我倾向于采用文档方法]
-
@DavidRodríguez-dribeas 在什么基础上?标准中有很多函数需要引用,所需的生命周期永远不会超过函数本身。我们基于什么(除了 Boost 所做的)假设这不是这里的意图?
-
好的,所以你说这可能是实现中的一个错误,并且标准可能被设计为复制参数。是的,这是第三种方法:)
-
@DavidRodríguez-dribeas 是的。我说我不知道意图是什么。皮特的回答表明委员会没有考虑到这个问题,所以没有明确的意图。这意味着他们下次会讨论并做出决定。