Visual Studio regex_iterator 错误?

2024-01-11

我使用的是 Visual Studio 2013,我发现了一个错误,我希望有人可以确认?

string foo{ "A\nB\rC\n\r" };
vector<string> bar;

for (sregex_iterator i(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}")); i != sregex_iterator(); ++i){
    bar.push_back(i->operator[](1).str());
}

此代码命中 Visual Studio 正则表达式库中的调试断言:

regex_iterator成为孤儿

如果我定义regex之外的for-循环就可以了:

string foo{ "A\nB\rC\n\r" };
vector<string> bar;
regex bug("(.*)[\n\r]{1,2}");

for (sregex_iterator i(foo.cbegin(), foo.cend(), bug); i != sregex_iterator(); ++i){
    bar.push_back(i->operator[](1).str());
}

或者,这在转换中效果很好,如下所示这个问题 https://stackoverflow.com/q/29895519/2642059:

string foo{ "A\nB\rC\n\r" };
vector<string> bar;

// This puts {"A", "B", "C"} into bar
transform(sregex_iterator(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}")), sregex_iterator(), back_inserter(bar), [](const smatch& i){ return i[1].str(); });

有人可以确认这是一个错误吗?


在 C++11 中你可以绑定一个临时的regex to const regex &如果迭代器在临时生命周期之外使用,这可能会导致未定义的行为,因为它将存储指向它的指针。这是规范中的缺陷,并不是错误,尽管 Visual Studio 通过调试断言捕获了此问题。

sregex_iterator i(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}"))
                                            ^^^^^
                                            temporary

C++14 中添加了以下删除的重载以防止这种情况,从参考参数 http://en.cppreference.com/w/cpp/regex/regex_iterator/regex_iterator:

regex_iterator(BidirIt, BidirIt,
           const regex_type&&,
           std::regex_constants::match_flag_type =
           std::regex_constants::match_default) = delete;       (since C++14)

它说:

不允许使用临时正则表达式调用重载 2, 因为返回的迭代器将立即失效。

所以这不是一个Visual Studiobug,因为它正在实现 C++11 标准,并且直到后来才通过缺陷报告解决这个问题。两个都clang and gcc using -std=c++14或更大的值会导致你的第一个错误(现场观看 http://melpon.org/wandbox/permlink/gepU41fsWrHBgHm2)和第三个(现场观看 http://melpon.org/wandbox/permlink/a8WYGC64U2uXr9vX) 例子。 Visual Studio 仅开始支持部分 C++14VS 2015 https://www.visualstudio.com/en-us/news/vs2015-preview-vs.aspx:

[...]以及对某些 C++14 功能的初步支持。[...]

我们可以看到LWG 缺陷 2332:regex_iterator/regex_token_iterator 应禁止临时正则表达式 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2332处理这个:

用户可以编写“for(sregex_iterator i(s.begin(), s.end(), 正则表达式(“喵”)),结束;我!=结束; ++i)",将临时正则表达式绑定到 const regex& 并存储指向它的指针。这将静默编译, 在运行时触发未定义的行为。我们现在有技术 以防止编译,就像 Reference_wrapper 拒绝这样做一样 绑定到临时对象。

作为 T.C.指出您显示的最后一个示例实际上是可以的,即使您绑定的是临时变量,它的生命周期也会延伸到表达式的末尾。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio regex_iterator 错误? 的相关文章

  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 在 jQuery 选择器上使用正则表达式查找基于 ids 的所有元素

    我有几个具有唯一 id 的元素 如下所示 div div div div div div 我希望使用 jQuery 可以实现以下功能 item top each function this hide 我对正则表达式没有很好的掌握 希望得到一
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐

  • 总结 sf::st_intersection() 中几何图形重叠的属性

    我想总结一组几何图形的属性 对它们重叠的值进行求和 library devtools install github r spatial sf library sf m rbind c 0 0 c 1 0 c 1 1 c 0 1 c 0 0
  • 如何查看Tortoise HG发出的Mercurial命令?

    我有办法查看 Tortoise HG 发出了哪些 Mercurial 命令吗 例如 如果我在 Tortoise 中使用 Shelve 命令 我想看看它如何 以及是否 在幕后调用 hg shelve 在某些工具中 有一个 查看 gt 始终显示
  • GCP 实例可以使用单个网络接口的最大带宽是多少?

    我正在使用 n 个并行进程将数据上传到 Google 云存储桶 出口数据速率约为 16Gbps 仅使用 n 个进程并行从 gcp 存储桶下载数据时 入口流量约为 26Gbps 但是当我使用相同的编号同时执行上传和下载时 的进程 入口速率降低
  • Java 方法引用具有泛型参数的方法

    我正在尝试对具有在类声明中指定的通用参数的方法进行方法引用 所以我有 public interface IExecutable p void execute P parameter public class Parameter implem
  • Android - 在运行时更改片段布局

    我想在我的应用程序中实现单活动多片段设计 我计划有几个 屏幕 片段的布局 我将在代码中切换 可能添加到后台堆栈 据我了解 每个屏幕中片段的布局是使用布局对象 例如 FrameLayout 设置的 该对象充当片段的占位符 共享相同的 ID 由
  • Spring 拦截 url 模式

    Spring Security 拦截 url 模式与 path 或 path 有什么区别 我见过一些具有以下内容的 Spring 安全配置 但我不明白 与 The vs 现在框架中很常见 通常称为Apache Ant Pathing或类似的
  • 指针、引用和常量引用参数的函数调用歧义

    我想做的是 允许使用 setter 函数传递指针 引用或常量引用 class A std string p std string st public A p 0 A setS const std string s std cout lt l
  • 新版本的java可以在旧版本上运行吗? [复制]

    这个问题在这里已经有答案了 我有一个疑问 java是向后兼容还是向前兼容 另外 我们可以在具有 JDK 8 的 MAC 上运行用 JDK 11 Windows 编写的 java 字节码吗 我试图理解平台独立性的概念 简短回答 是的 这才是重
  • 是否可以在运行时获取依赖版本,包括从库本身获取依赖版本?

    背景 假设我制作了一个名为 MySdk 的 Android 库 并将其发布到 Jitpack Maven 上 SDK 的用户只需添加以下依赖项即可使用它 implementation com github my sdk MySdk 1 0
  • 使用位移位求整数平方根的最快方法是什么?

    我一直在寻找最快的方法来计算数字 整数 的平方根 整数 我在维基百科中遇到了这个解决方案 它找到一个数字的平方根 如果它是一个完美的平方 或其最接近的下完美平方的平方根 如果给定的数字不是一个完美的平方 short isqrt short
  • 将 XML 转换为 C# 对象

    我需要从这些 xml 数据中获取 OrderID
  • 如何从handlebars.js部分加载多个模板

    有没有一种简单的方法可以使用handlebars js 加载包含多个模板的部分 就像使用mustache js 和来自 jonnyreeves 的 jQuery 插件 https github com jonnyreeves jquery
  • 使用 eclipse 的 Android multidex 支持库

    使用 Eclipse 可以使用 multidex 生成 Android 项目来创建多个 dex 文件 在网上搜索我发现如何使用 gradle 来做到这一点 但没有关于使用它 没有 gradle 的 Eclipse 看起来像ADT蚂蚁任务项目
  • VB.NET WebBrowser禁用javascript

    有没有办法在 vb net 中禁用 javascript webbrowser 对我有用 Private Function TrimScript ByVal htmlDocText As String As String While htm
  • 检测 Spring Boot 应用程序时的类路径问题

    我有一个 springboot 应用程序 我正在尝试使用 bytebuddy 来检测它 我遇到了我无法理解的类路径问题 首先 以下是这方面的其他文献 https github com raphw byte buddy issues 473
  • 如何在 Coq 中切换当前目标?

    是否可以切换当前目标或子目标来在 Coq 中进行证明 例如 我有一个这样的目标 来自 eexists 1 1 s gt 0 r1 r1 s1 s r3 r3 s2 我想做的是split并首先证明正确的连接 我认为这将给出存在变量的值 s 并
  • Apache Thrift 和 ZeroMQ 之间的区别

    据我了解 Apache Thrift 和 ZeroMQ 是属于不同类别的软件 并且很难进行比较 因为这是苹果与橘子的比较 但我不知道为什么它们属于不同的类别 它们不是都用于在不同的服务之间传递数据吗 这些服务可能用不同的语言编写 也可能不是
  • QT 以普通用户身份启动程序

    我的自动更新程序需要管理员权限才能运行 因为它会修改程序文件夹中的文件 这一切都很好 但是 更新完成后我想要我的updater exe开始myApplication exe but without管理员权限 我当前用于从 updater e
  • bitbucket web:突出显示或灰显的合并提交?

    我想知道为什么在 bitbucket webui 的提交视图中 我看到一些合并提交的 M 为灰色 而其他提交则为彩色 如何设置或如何检测它们 我无法找到有关此行为的任何文档 此行为基于提交评论 它必须包含以下行 Conflicts src
  • Visual Studio regex_iterator 错误?

    我使用的是 Visual Studio 2013 我发现了一个错误 我希望有人可以确认 string foo A nB rC n r vector