std::tuple 和 std::pair 支持聚合初始化吗?

2024-01-01

聚合初始化 http://en.cppreference.com/w/cpp/language/aggregate_initialization除其他外还需要没有用户提供的构造函数. But std::tuple and std::pair对有一大套重载构造函数 http://en.cppreference.com/w/cpp/utility/tuple/tuple。从核心语言来看,这些构造函数是用户提供的甚至用户声明的 ?

使用 C++17 可以编写(更新/澄清:其中 nocopy 是无法复制或移动的类,例如std::mutex)

auto get_ensured_rvo_str(){
   return std::pair(std::string(),nocopy());
}

编辑:不,正如链接的答案和下面的答案中所解释的那样,这是不可能的。

这需要聚合初始化(对于上下文:C++17 中具有不可移动类型和有保证的 RVO 的多个返回值(结构化绑定) https://stackoverflow.com/questions/38385451/multiple-return-values-structured-bindings-with-unmovable-types-or-guaranteed).

Are tuple and pair由特殊标准语言支持以允许这样做(在存在构造函数的情况下)? :

20.5.2.1 构建

... 显式 constexpr tuple(const Types&...);

6 效果: 构造函数使用以下值初始化每个元素 相应的参数。

或者我们原则上可以编写自己的tuple or pair?


不,没有支持tuple or pair用于将不可移动类型传递给其构造函数,正如您所观察到的那样,不可能存在,因为构造函数参数和元组(或对)成员可以观察到不同的物体:

// exposition only
template<class... Us>
tuple(Us&&... us) : values{std::forward<Us>(us)...} {}
              ^^ these
                    ^^^^^^ are different objects to these

您必须使用分段构造:

return std::pair<std::string, nocopy>(std::piecewise_construct,
    std::forward_as_tuple(), std::forward_as_tuple());

马特·卡拉布雷斯做了一个有趣的一点 https://isocpp.org/forums/iso-c-standard-future-proposals?place=msg%2Fstd-proposals%2FJ62lsMB6Egc%2F38M9WKYvCQAJ在 std-proposals 列表中,现在我们已经保证 RVO 应该可以编写接受工厂以有效地就地构造其成员的组件:

// hypothetical factory constructor
return std::pair(std::factory_construct,
    [] { return std::string{}; }, [] { return nocopy{}; });

另一个可能的方向是从中删除构造函数tuple and pair(或者,更现实地说,编写没有构造函数的类似组件)并依赖于聚合初始化的新扩展 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0017r0.html应该允许聚合初始化tuple and pair通过多重继承实现。Example http://melpon.org/wandbox/permlink/63SPQHgu1myz3Twi.

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

std::tuple 和 std::pair 支持聚合初始化吗? 的相关文章

随机推荐

  • PHP进程间通信监控消息队列

    我正在开发一个项目 为排行榜和其他几个位置生成统计数据 我的目标是尽可能实时 因此我实现了一个用于消息队列的 RabbitMQ 服务器 在前端 我有一个 Nodejs 设置 用于将信息提供给正在观看它的客户 在同一台服务器上 我有一个 PH
  • InvalidOperationException:内容类型不正确:ASP.NET Core

    我有两种表格 一种用于登录 一种用于注册 它们都在同一视图上并使用同一模型 我正在使用控制器处理表单提交 我在访问登录页面时收到以下错误 InvalidOperationException Incorrect Content Type 完整
  • Custom.css 在 32.0.1700.76 m Google Chrome 更新中停止工作

    我使用此网站上的 Google 开发者工具的一些主题 http devthemez com themes chrome developer tools http devthemez com themes chrome developer t
  • 如何将元素数组转换为 NodeList?

    首先第一件事是 这不是问如何将 NodeList 转换为数组 这是相反的 为了保持一致性 我想创建一个返回 NodeList 的函数 就像document querySelectorAll does 这是我当前的代码 var toNodeL
  • 如何使用reason-react有条件地在JSX中设置HTML属性?

    我想渲染一个 HTML 复选框 其选中状态由数据控制 给出一个接收一个无状态组件item type label string checked bool Like so let component ReasonReact statelessC
  • 删除 MySQL 表中的重复条目[重复]

    这个问题在这里已经有答案了 我有一个有几千行的表 该表包含两列 name and email 我有几个重复的行 例如 约翰 史密斯 电子邮件受保护 cdn cgi l email protection 约翰 史密斯 电子邮件受保护 cdn
  • 有没有办法影响 AlchemyAPI 情感分析

    我使用 AlchemyAPI 进行文本分析 我想知道是否有办法影响 API 结果或根据要求对其进行微调 我试图分析互联网上可用的不同呼叫中心对话 了解情绪 即客户是否不满意 生气 因此对话是否消极 对于十分之九的对话 它给出的情绪是积极的
  • 无法解析:com.google.code.gson:gson.2.2.2

    我将项目从 eclipse 导入到 android studio 并在将项目与 gradle 文件同步后收到上述消息 我是 android studio 的新手 不知道如何解决这个错误 以下是 Gradle 文件 apply plugin
  • Bitbucket 上的 Git:始终要求输入密码,即使在上传我的公共 SSH 密钥后也是如此

    我上传了我的 ssh id rsa pub to Bitbucket 的 SSH 密钥 https bitbucket org account ssh keys as 解释了 https confluence atlassian com b
  • Windows Phone 8.1 设备 (Lumia 930) 和 VS2013 调试仅适用于禁用 WiFi

    当 Windows Phone 8 1 应用程序启动进行部署和调试时 VS2013 中出现错误 错误 1 错误 DEP6100 发生以下意外错误 在 boostrapping 阶段 连接到设备 SmartDeviceException 部署
  • Flutter 自动完成功能在 VSCode 中不适用于包

    我将整个 flutter 项目移动到一个新文件夹 一切运行正常 自动完成功能适用于 flutter 中的构建文件 例如 Container Column 但是当我尝试使用包 例如提供者 时 我需要进入 pub dev 页面并复制导入 手动导
  • word2vec - 什么是最好的?添加、连接或平均词向量?

    我正在研究循环语言模型 为了学习可用于初始化语言模型的词嵌入 我使用 gensim 的 word2vec 模型 训练后 word2vec 模型为词汇表中的每个单词保存两个向量 单词嵌入 输入 隐藏矩阵的行 和上下文嵌入 隐藏 输出矩阵的列
  • Hadoop集群节点数

    我正在尝试设置 Hadoop 多节点集群 当我启动集群时 这是我在控制台中的响应 hduser hadoop master usr local hadoop usr local hadoop sbin start dfs sh Starti
  • Base64 图像上传到 S3 时损坏

    router post image multipartMiddleware function req res var file name req body name var data req body data return s3fsImp
  • 如何验证空手道 BDD 响应中收到的日期

    我的响应中有两个字段 响应中有两个参数 日期1 2018年12月18日 日期2 2018年11月23日 我想测试 id date1 是否小于今天的日期 并且 date2 小于请求参数中的某个其他日期 我不知道如何在空手道模式验证中执行此操作
  • 浮动操作按钮阻止其他组件

    谷歌的新材料设计建议使用浮动操作按钮来吸引用户注意屏幕上的主要操作 列表视图中有很多这样的例子 现在 假设您的列表视图有足够的项目来填满屏幕 从而无法滚动 如果您的列表项具有用户可以与之交互的某个组件 例如开关或最喜欢的星星 则浮动操作按钮
  • 如何将大型 JSON 文件分割成块并使用 GSON 进行排序

    我有一个巨大的 JSON 文件 名为 Something json 文件大小为 20 MB 我正在用 GSON 读这篇文章 它可以在标准 Android Nexus 5X 上读取 Json 示例 country UA name Hurzuf
  • 在Python中进行刷新时如何防止BrokenPipeError?

    问 有没有办法使用flush True为了print 函数没有得到BrokenPipeError https docs python org 3 library exceptions html BrokenPipeError 我有一个脚本p
  • 如何提示用户保存自动 Excel 文件

    我已经搜索过 但我发现没有任何内容直接符合我要查找的内容 或者也许我的搜索没有符合单词组合 在 C 中 我使用 Interop Excel 创建了一个 Excel 工作表 在其中插入一些数据并创建一个图表 当我执行 xlWorkBook S
  • std::tuple 和 std::pair 支持聚合初始化吗?

    聚合初始化 http en cppreference com w cpp language aggregate initialization除其他外还需要没有用户提供的构造函数 But std tuple and std pair对有一大套