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

标签 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,当然)。

最佳答案

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

关于c++ - 在 C++ 中的函数参数中使用构造函数是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9094224/

相关文章:

c++ - 释放在类中分配的 vector ?

c# - VS2010 中的快速测试代码选项

c++ - 将 std::shuffle 与自定义随机数生成器一起使用?

c++ - 指向复数 <double> sin 的指针

c++ - 在 VC11 中启用/禁用 SAFESEH?

c++ - 以 C++03 为目标时,使用 std::basic_string<t> 作为连续缓冲区是否合理?

c++ - 使用opencv在MFC图片中显示视频时GUI无法点击

visual-studio-2010 - VS2010 : "Unable to start debugging"

visual-studio - Visual Studio Express for Phone 7 系列会破坏 Visual Studio 2010 吗?

c++ - 前面有 `std::partial_sum` 的 `0` 最干净的方法是什么?