GCC 对潜在有效的代码抛出 init-list-lifetime 警告?

2024-05-08

我在 Debian不稳定的GCC 9.3.0上运行。

我从事的一个项目最近发生了变化,引入了类似于下面的代码。

#include <initializer_list>
#include <map>
#include <vector>

std::map<int, std::vector<int>> ex = []{
    /* for reused lists */
    std::initializer_list<int> module_options;

    return (decltype(ex)) {
        {1, module_options = {
            1, 2, 3
        }},
        {2, module_options},
    };
}();

这个想法是,初始化器列表的相同小节首先在顶部声明、定义并分配给std:initializer_list第一次使用时变量,然后在多个地方使用。这很方便,有些人可能会认为更具可读性,这就是它被接受的原因。

一切都很好,直到几天前,GCC 开始抛出一个init-list-lifetime代码上的警告。我们用-Werror在我们的回归中,所以这对我来说是失败的回归。我还尝试使用 clang 9.0.1 进行编译,它不会抛出警告。

<source>: In lambda function:
<source>:12:9: warning: assignment from temporary 'initializer_list' does not extend the lifetime of the underlying array [-Winit-list-lifetime]
   12 |         }},
      |         ^

根据参考参数 https://en.cppreference.com/w/cpp/utility/initializer_list:

在原始初始化列表对象的生命周期结束后,不保证底层数组存在。 std::initializer_list 的存储未指定(即它可以是自动、临时或静态只读内存,具体取决于情况)。

所以我的理解是,公共初始值设定项列表值在包含初始值设定项列表的范围内定义,其生命周期以封闭初始值设定项列表结束。从前面的 cppreference 页面中,它提到std::initializer_list是一个“轻量级代理对象”,这意味着它不获取临时对象的所有权或延长其生命周期。这意味着不能保证底层数组在以后的使用中存在,这就是抛出警告的原因。这个分析正确吗?

我可以通过移动来防止警告发生std::initializer_list变量初始化到声明。有关项目中问题的完整详细信息,请参阅PR https://github.com/cocotb/cocotb/pull/1975/files.


所以我的理解是,公共初始值设定项列表值在包含初始值设定项列表的范围内定义,其生命周期以封闭初始值设定项列表结束

您正在谈论由纯右值表达式创建的对象{1, 2, 3}, right?

有一个例子decl.init.list/6 http://eel.is/c++draft/dcl.init.list#6,

该数组与任何其他临时对象具有相同的生命周期([类.临时的 http://eel.is/c++draft/class.temporary]),除了初始化一个initializer_­list数组中的对象延长了数组的生命周期,就像将引用绑定到临时对象一样。 [Example:

// ...
std::initializer_list<int> i3 = { 1, 2, 3 };
// ...

其中标准(或草案)说

For i3, the initializer_­list对象是一个变量,因此该数组在变量的生命周期内持续存在。

这表明该对象必须被具体化并且应该延长其生命周期。

然而,你是not初始化initializer_list表达式中的对象,因为您的变量已经初始化。如果我们将您的代码重写为对名义上的调用

module_options.operator=({1, 2, 3})

那么我们就不会期望临时生命周期会延长到函数调用结束之后。

我怀疑临时变量仍然会存在到完整表达式的末尾,因为我认为绑定对的引用应该是extend它的寿命而不是减少它:但不可否认类.临时/6 http://eel.is/c++draft/class.temporary#6 says “...在引用的生命周期内持续存在...”并不是“……坚持不懈at least一生……”

但是,这确实意味着原始代码的以下变体应该可以满足您的要求:

std::map<int, std::vector<int>> ex = []{
    /* for reused lists */
    std::initializer_list<int> module_options { 1, 2, 3 };

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

GCC 对潜在有效的代码抛出 init-list-lifetime 警告? 的相关文章

  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 隐式将 string 转换为 string_view

    void Foo1 string view view string str one two three Foo1 one two three Implicitly convert char to string view Foo1 str I
  • 为什么这些冲突出现在以下 XML 的 yacc 语法中

    我有以下 XML 语法 效果很好 program lt ID attribute list gt root root lt ID attribute list gt node list lt ID gt node list node s n
  • tmpnam 的 C/C++ 线程安全性?

    我需要使用tmpnamC 中的函数 但我需要了解它的线程安全性 也就是说 如果我有多个线程 每个线程都需要为临时文件获取不同的名称 我是否可以保证每个线程都会收到具有不同名称的文件 tmpnam 仅保证该文件当时不存在 但它可能会在您自己创
  • pybind11 返回 numpy 对象数组

    使用 pybind11 C API 和 python3 我们如何在 C 实现中正确创建一个 numpy 对象数组 即 unicode 字符串 并将其返回给 python 传递到 pybind11 array 的底层数据数组的确切内存布局是什
  • Visual Studio:同时调试多个项目?

    是否可以在 Visual Studio 中同时调试多个项目 我知道您可以从解决方案属性中选择多个启动项目 但是断点是如何处理的 如果两个项目使用同一个类 它的两个不同实例 并且我因其中的断点而停止 那么它只会阻止一个程序还是同时阻止两个程序
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • DirectX Vertex 中的 THE 是什么

    我知道 RHW 是倒数同质 W 但有人可以解释一下它的使用方法和作用吗 gamedev论坛上的说明post http www gamedev net topic 440283 reciprocal of homogeneous w and
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 如何用C语言创建字典?

    我正在用 C 语言编写一个微控制器 作为它的一部分 我想在 7 段显示器上显示某些字母 每个字母都有一个对应的数字 使 7 段显示屏显示该字母 它没有真正的模式 因为数字只是通过将显示字母所需的 7 段显示器上的位相加而成 因此如果我可以创
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • 确定所选电子邮件是来自收件箱还是已发送邮件

    我正在编程Outlook 插件并需要确定所选电子邮件是否来自Inbox or Sent Items这样当我将电子邮件保存到数据库中时 我可以使用文件夹 收件箱 或 已发送 来标记电子邮件 我知道我可以将文件夹名称与 收件箱 或 已发送邮件
  • 以编程方式打开网页并以字符串形式检索其 html 包含内容

    我有一个 Facebook 帐户 我想提取我朋友的照片及其个人详细信息 例如 出生日期 就读学校 等 我能够提取我每个朋友帐户的 Facebook 首页的地址 但我不知道如何以编程方式打开我每个朋友首页的网页并将 html 包含保存为字符串
  • 寻找自定义 SynchronizationContext 的示例(单元测试所需)

    我需要定制同步上下文 http msdn microsoft com en us library system threading synchronizationcontext aspx that 拥有一个运行 Posts 和 Sends
  • C# 从字符串变量中获取类型并在泛型方法中使用它

    我希望能够通过某种方式 即从数据库 获取我收到的字符串值的实际类型 这样我就可以在通用方法中使用该类型 例如DoSomething
  • 是否可以在 ASP.NET Web API 和 SPA 中使用基于 cookie 的身份验证?

    我想创建基于 angularjs 前端和 ASP NET Web API 的 Web 应用程序 我需要创建安全 api 但我无法在将实施此 Web 应用程序的公司服务器上使用基于令牌的身份验证 是否可以对 SPA 和 ASP NET Web
  • 如何将 .ashx 处理程序与 asp:Image 对象一起使用?

    我有一个 ashx 处理程序 using System using System Web public class Thumbnail IHttpHandler public void ProcessRequest HttpContext
  • Linq 表达式树 Any() 问题

    您好 我在使用 Any 扩展方法的表达式树时遇到问题 这是我的代码 IQueryable
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable
  • printf 右对齐括号内的数字

    我正在编写一个程序 显示数组中的所有信息 它必须以括号中的数组索引开头 例如 2 并且它们必须彼此正确对齐 如果只是数字 我知道你可以这样做 printf 10d index 但是用括号括起来会得到以下输出 1 2 10 11 当我真正希望

随机推荐

  • 如何验证公钥是由您的私有 CA 颁发的?

    我创建了一个 CA 证书 并用它来颁发公钥 在将来的某个日期 我需要验证加载的证书是否由我的 CA 颁发 如何使用 OpenSSL API c 做到这一点 我已将 verify c 在 openssl apps 中 减少到所需的最少功能 假
  • 如何使用 Relay 发送临时查询?

    我是 Relay 的新手 仍在尝试了解它 根据我的理解 Relay 将查询与组件联系起来 这样 您可以说组件需要从 GraphQL 服务器提供 x y 和 z 据我了解 官方react relay库将在适当的时间分派这些查询 可能是在组件即
  • c - 将 .data 发送到不同的部分

    我想把其中的符号 data为特定 C 文件生成的节并将它们放在不同的节中 例如 mydata 在最终的可执行文件中 例如 normaldata c char my str this should appear in data special
  • 在 Microsoft Sql Server 2008R2 及更高版本上隐藏登录数据库 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 请任何人协助隐藏 sql server 2008R2 或更高版本上的可用数据库 我有一个新的登录用户 已映射到特定数据库 使用特定登录用户登录时 我可
  • 正则表达式匹配非整数?

    尝试创建一个忽略正确整数的正则表达式 1 5 999等 和正斜杠 但在其他所有内容中都找到匹配项 例如 它将找到以下匹配项 test test1 test 1 但忽略了 1 55 7 这是为了模组重写 0 9 我想应该可以解决这个问题 它将
  • JQuery UI Sortable - 将占位符添加到列表中以模拟空白空间

    JQuery UI Sortable 对于没有间隙的列表非常有用 但假设我想渲染有间隙的项目列表 例如 1 2 空 4 5 6 空 8 其中数字表示插槽编号 预期的行为是 如果用户将一个元素拖动到 2 插槽上 则 2 值将被推送到空插槽 3
  • 两组点之间的距离[重复]

    这个问题在这里已经有答案了 因此 在查看了 stackoverflow 上提出的各种问题后 我仍然无法理解 R 中的 dist 函数 甚至无法理解一般的距离矩阵 所以我有两个带有 xy 坐标的数据框 df1 lt data frame x
  • 如何找到每个分类变量的连续变量的平均值

    我想在 y 轴上绘制连续的 BMI 在 x 轴上绘制家庭收入的分类变量 并且我希望该图绘制每个类别的平均 BMI 然而 我不知道如何找到家庭收入每个因素的平均体重指数 Dataset nh 5994 total IDs with Obser
  • Spring Boot,使用 EhCache 进行缓存

    我需要在我的应用程序中缓存一些数据 我正在考虑使用 Ehcache 我有几个问题 Ehcache需要另外一台服务器吗 我需要其他客户端来使用 Ehcache 吗 Ehcache 如何与多个实例配合使用 是否有可能使用 Ehcache 创建类
  • 在 C++ 程序中多次使用 FindWindows?

    我使用以下代码 C 来获取窗口 另一个应用程序 的句柄并向其中一个按钮发送消息以模拟单击 并且它可以正常工作 BOOL CALLBACK EnumChildProc HWND hwnd LPARAM lParam mdv test list
  • 在 C++ 中实现(类型化)K 组合器

    我正在尝试从以下位置实现 K 组合器SK组合器演算 https en wikipedia org wiki SKI combinator calculus Informal description在C 中 K 组合器是高阶函数 https
  • WWW::Mechanize::Firefox - 如何打开多个选项卡

    我想打开两个单独的选项卡并在 Firefox 中保持打开状态 我在用WWW Mechanize Firefox 请找到下面的代码 usr bin perl w use strict use WWW Mechanize Firefox my
  • Oracle使用with子句创建表

    我可以从使用形成的查询创建表吗with clause Sure CREATE TABLE t AS WITH some data AS SELECT 1 as some value FROM dual UNION ALL SELECT 2
  • 什么是离散动画?

    The MDN 动画文档 https developer mozilla org en US docs Web CSS animation v control指动画类型是离散 这是什么意思 离散动画从一个关键帧进行到下一关键帧 无需任何插值
  • 关于 mongodb java 驱动程序的困惑[重复]

    这个问题在这里已经有答案了 我是 MongoDB 的初学者 我正在使用 JAVA 驱动程序来使用它 我有以下代码 MongoClient client new MongoClient DB d client getDB world DBCo
  • PHP:测试三个变量是否相等

    我以前从未遇到过这种情况 但是如何测试三个变量是否相同 以下内容显然不起作用 但我想不出一种优雅 且正确 的方式来编写以下内容 if select above average select average select below aver
  • 从 MySQL 列创建 PHP 数组

    mysql fetch array会给我一个获取行的数组 从一列中所有行的值生成数组的最佳方法是什么 您可以循环遍历数组并创建一个新数组 如下所示 column array while row mysql fetch array info
  • 打字时使用 Roslyn 的 CompletionSevice 最有效的方法是什么?

    我在看罗斯林的CompletionService http source roslyn io Microsoft CodeAnalysis Features Completion CompletionService cs 53 and Sh
  • Dialogflow Google Assistant Alpha 版本始终失败,并显示以下消息:“For en:您的示例发音结构不正确。”

    Google Assistant Alpha 版本无法正常工作 它总是显示消息 对于 en 您的示例发音结构不正确 当您在操作发布后对其进行重命名时 就会发生这种情况 转到部署 gt 目录信息 gt 其他调用短语 并将调用短语替换为更新的操
  • GCC 对潜在有效的代码抛出 init-list-lifetime 警告?

    我在 Debian不稳定的GCC 9 3 0上运行 我从事的一个项目最近发生了变化 引入了类似于下面的代码 include