在C ++中使用函数参数中的构造函数是否安全?

时间:2012-02-01 10:25:28

标签: c++ visual-studio-2010 std tr1

此C ++代码在Visual Studio 2010中失败:


const sregex_iterator end;
for (sregex_iterator match(origString.begin(), origString.end(), regex(regExPattern)); match != end; ++match)
{
    useMatch(*match);
}

在第一个循环之后,在第一个迭代器增量(operator++)中,调试器失败,表明regex_iterator是“孤立的”。

我注意到了这个可疑的正则表达式构造函数(我从某个地方复制了这个片段),我尝试了这个:


const sregex_iterator end;
regex regexObj(regExPattern);
for (sregex_iterator match(origString.begin(), origString.end(), regexObj); match != end; ++match)
{
    useMatch(*match);
}

这很有效。

但是,为什么第一次尝试失败了?我认为它必须与for范围或者内联构造函数以及迭代器构造函数中的regex参数是引用...

但是,正如我前一段时间在stackoverflow中读到的那样,我只记得我理解的内容,而且我想知道在C ++中使用构造函数作为函数参数是否安全(不使用new,当然)。

1 个答案:

答案 0 :(得分:5)

我想在第一种情况下,regex被创建为临时对象,并在匹配初始化后立即销毁。它需要有一个在整个循环中扩展的生命周期。