2012-02-01 51 views
1

该C++代码失败在Visual Studio 2010:在C++的函数参数中使用构造函数是安全的吗?


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); 
} 

这完美地工作。

但是,为什么第一次尝试失败?我suposse它必须与for作用域或可能与内联的构造函数,并在迭代器构造函数中的正则表达式参数是一个参考的事实...

但是,正如我在前面读到的stackoverflow,我记得只有我理解的东西,我想知道在C++中使用构造函数作为函数参数是否安全(当然,不使用new)。

+1

您是不是正在将'const sregex_iterator end'初始化为任何东西? – Chowlett 2012-02-01 10:34:28

+1

@Chowlett:是的,这是创建“结束标记”迭代器的(不直观的)方法。 – 2012-02-01 11:35:45

回答

5

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

+0

+1:在初始化之后,很可能是正则表达式模式被破坏(超出范围)。 – 2012-02-01 11:01:57

+0

那么,如果你在方法参数中调用构造函数,它只有那个调用的范围?这只会在方法复制参数(或通过值传递)时起作用,不是吗? 而且,为什么第一个循环有效?它只在操作员失败++ – 2012-02-01 11:42:19

+0

还有一件事:如果你是对的(我认为你是),这个页面中的例子是错误的,不是吗? http://en.cppreference.com/w/cpp/regex/regex_iterator – 2012-02-01 11:53:03

相关问题