Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::regex_匹配(和std::regex_搜索)参数的生存期约束_C++_C++11 - Fatal编程技术网

C++ std::regex_匹配(和std::regex_搜索)参数的生存期约束

C++ std::regex_匹配(和std::regex_搜索)参数的生存期约束,c++,c++11,C++,C++11,考虑签名者std::regex_匹配的C++11函数( std::string const&,std::smatch&match,std::regex const&re),什么 对第一个参数的生存期有限制吗?我找不到 但是当我执行以下程序(用VC++2010编译)时, 迭代器调试(活动): int main() { std::字符串a(“aaa”); 标准::字符串c(“ccc”); 标准::regex re(“aaa(.*)ccc”); std::smatch m; if(std::regex

考虑签名者
std::regex_匹配的C++11函数(
std::string const&,std::smatch&match,std::regex const&re)
,什么 对第一个参数的生存期有限制吗?我找不到 但是当我执行以下程序(用VC++2010编译)时, 迭代器调试(活动):

int
main()
{
std::字符串a(“aaa”);
标准::字符串c(“ccc”);
标准::regex re(“aaa(.*)ccc”);
std::smatch m;
if(std::regex_匹配(a+“xyz”+c,m,re)){

std::cout我不记得在采用
tr1::regex
std::regex
期间对这种可能性进行过任何讨论,因此我认为它根本没有被考虑。事后看来,这肯定是一个我们应该预见到的陷阱。在我的脑海中,一个重载会占用
std::字符串&
,这将表明一个临时的涉及y,需要一份副本。因此我将向标准委员会报告。(完全披露:我编写了Dinkumware实现,这是Microsoft提供的)

此超负荷的
regex\u match
规范声明它(28.11.2[re.alg.match]/6):

返回:
regex\u匹配(s.begin(),s.end(),m,e,flags)

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


在讨论过程中出现了此问题。有人建议在规范中添加额外的重载,以捕获右值字符串参数(例如
basic\u string&&
),这将给出一个很好的编译错误,而不是此运行时错误。不过,库规范不包括这些重载,而且我也没有看到有关此的缺陷报告。

我将发送一个DR。现在,DR中应该包含的内容是另一个问题。选项可能只是记录或提供一个采用右值引用的重载因此,看起来正确的简单代码能够正确运行。[我倾向于使用文档方法]@DavidRodríguez dribeas基于什么?标准中有很多函数引用,并且所需的生存期永远不会超过函数本身。基于什么(除了Boost所做的以外)我们是否认为这不是我们的意图?好吧,那么你是说这可能是实现中的一个缺陷,标准可能是为了复制这个论点。是的,这是第三种方法:)@DavidRodríguez dribeas是的。我是说我不知道意图是什么。Pete的回答表明委员会e没有想到这个问题,所以没有明确的意图。这意味着他们下次会讨论这个问题,并做出决定。而且你很可能基于Boost,它也有同样的问题(包括缺少与任何需求相关的文档)。这通常不是一个问题,因为您通常不会尝试匹配临时值。(另一方面,我可以很容易地看到将本地字符串匹配到循环,而
smatch
位于循环外部,并在循环结束后使用。)@ JAMESKANZE-它不是基于Boost。只是在这方面缺乏视觉。这个问题不仅仅是用RoVals。考虑一个“代码”> SMANG/<代码>在一个循环之外声明,并在循环中用一个定义在循环中的字符串调用<代码> ReXeXMatals<代码>。问题是复杂的:它可以工作。(通过保留字符串的副本以备匹配),因此可能需要它工作。@JamesKanze-这一点很好。但这意味着图书馆通常无法检测到这一终身问题。保留字符串副本是一项相当繁重的任务,因此我在这一点上的倾向是保持它的原样,并告诉人们“不要那样做”.但是,当然,我不是代表委员会说话。@JamesKanze:我看不出这与编译时无法检测到的其他生存期问题有什么不同:
{std::vector v;return v.begin();}
是格式良好的代码,并且(在所有情况下)都无法检测返回的迭代器在函数返回后失效。至少一个已删除的右值重载将有助于检测明显的误用。在我看来,
match_results
已经被充分指定:它只处理迭代器,这是一个很好的指示,表明应该注意迭代器所在范围的生存期我认为限制生命是一个有效的选择(不是限制生命);如果委员会决定这样做,我当然可以接受。但是如果有这样的限制,它必须是明确的。(这与另一个James的示例不同,在该示例中,您显式地将迭代器操纵到集合中。我认为这里的标准很明确:在集合停止存在后使用迭代器是未定义的行为。)
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;
}