为什么 C 类型泛型表达式不能与 C++ 兼容?

2024-02-06

我似乎记得从一些可靠来源(即委员会成员在非官方渠道中发言)听到过模糊的评论,即 C 类型泛型表达式不会添加到 C++ 中,因为它们不能添加。

据我所知,与 C++ 模板和重载相比,类型泛型表达式非常有限,但不存在需要定义为特殊情况的交互潜力。

类型通用表达式由控制表达式以及类型和子表达式之间的一系列“关联”组成。根据控制表达式的静态类型和为子表达式列出的类型选择子表达式,并替换 TGE。匹配基于类型兼容性的 C 概念,据我所知,这相当于具有以下类型的 C++ 标识:extern单一定义规则(ODR)下的链接。

如果派生类控制表达式能够选择 C++ 中的基类关联,那就太好了,但由于 C 没有继承,因此交叉兼容性不需要这种精确性。无论如何,这是否被认为是一个绊脚石?

Edit:至于更具体的细节,C11 已经提供了保留所选子表达式的值类别(左值性)的功能,并且似乎要求 TGE 是一个常量表达式(无论类别),只要它的所有操作数都是,包括控制表达。这可能是C语言的一个缺陷。无论如何,C++14 根据可能评估的内容定义常量表达式,并且 TGE 规范已经规定未选择的子表达式不会被评估。

关键是,TGE 的操作原理看起来很简单,可以移植,以后不会造成任何麻烦。

As for whyC++ TGE 将会很有用,除了最大化 C 和 C++ 的交集之外,它们还可用于本质上实现static_if,没有备受争议的条件声明功能。我不支持static_if,但是“就是这样”。

template< typename t >
void f( t q ) {
    auto is_big = _Generic( std::integral_constant< bool, sizeof q >= 4 >(),
        std::true_type: std::string( "whatta whopper" ),
        std::false_type: "no big deal"
    );
    auto message = _Generic( t, double: "double", int: 42, default: t );
    std::cout << message << " " << is_big << '\n';
}

“不可能”也许太强烈了。 “不确定是否可能”的可能性更大。

如果要将此功能添加到 C++ 中,则应完全指定它,包括与现有 C++ 功能的所有交互,其中许多功能不是用 C++ 设计的_Generic心里。例如。typeidC 中不存在,但应该可以在 C++ 中使用。你能用一个_Generic表达式为constexpr?作为模板参数?是不是一个lvalue?您可以获取它的地址并将其分配给函数指针,并获得重载决策吗?你能进行模板参数推导吗?你能用它吗auto? Etc.

另一个复杂之处是主要用例_Generic用于宏,它与 C++ 命名空间不能很好地配合。这acos示例来自tgmath就是一个明显的例子。 C++ 已经禁止了 C 的标准宏并要求它们是函数,但这不适用于tgmath.h.

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

为什么 C 类型泛型表达式不能与 C++ 兼容? 的相关文章

  • TFS API - 缓慢的 foreach 变更集迭代

    问题背景 我正在使用 TFS api 查询 TFS 服务器上的大范围 1 600 文件 我从每个文件中收集其所有 ChangesetId 然后将其收集在列表中 代码 这是我正在使用的代码 它可以正确生成 QueryHistory 方法中指定
  • 如何从更高级别启动用户级别的 Exe

    我希望一个进程始终在用户级别运行 当它由以管理员级别运行的安装程序 自定义 而不是 msi 启动时 或者当用户登录时 环顾四周 我不确定这是否可能 最简单的方法是有 2 个进程 一种是普通用户 它启动提升 管理进程 然后管理进程可以使用 I
  • C++11 中具有 C 链接的复杂类型

    我需要将 C 库的标头包含到我的 C 11 代码中 现在 标头提供了涉及大量的例程和数据结构double complex到处都是 例如 include
  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 如何通过实体键添加/删除与实体框架的多对多关系?

    I tried using Entities e new Entities EntityKey key new EntityKey Entities Users UserId 20 User user new User EntityKey
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • Debug.WriteLine() 未命中

    我正在调试 Windows 服务 通过点击F5在 Visual Studio 2010 中 使用以下代码 In 程序 cs file static void Main if Environment UserInteractive We ar
  • 如何正确实现带有 close 方法的处置模式(CA1063)

    框架设计指南 第二版 第 327 页 说 考虑提供方法Close 除了Dispose 如果接近 是该领域的标准术语 这样做时 重要的是使 Close 实现与Dispose并考虑实施IDisposable Dispose方法明确 因此 按照提
  • 如何修复 TcpClient Ip 标头错误校验和

    我正在使用 System Net Sockets TcpClient 类 但每当我通过网络发送自定义数据包时 我都会在wireshark捕获上看到错误的校验和 我该如何修复它 问题是您在网络接口上设置了校验和卸载 这会导致您的网卡计算校验和
  • 如何获取 PropertyGrid 的单元格值 (c#)?

    如何在 C 中获取属性网格项和项的值 例如 Name Ali LastName Ahmadi Name 和 LastName 是 propertygrid 的 2 个属性 PropertyGrid只是对象的组件模型表示的视图 我会说 查看组
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • “已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”

    我正在开发需要连接到另一个数据库以获取一些数据的应用程序 为此 我决定使用 SqlConnection reader 等 我需要执行一些查询 例如首先我需要获取某个用户的卡 ID 之后我需要通过该卡 ID 获取一些数据 这是我的代码 reg
  • C# While 循环与 For 循环?

    在 C 中 一个问题已经困扰我一段时间了 它的 While 和 For 循环之间的实际主要区别是什么 它只是纯粹的可读性吗 在 for 循环中本质上可以做的所有事情都可以在 while 循环中完成 只是在不同的地方 举这些例子 int nu
  • 获取进程的所有 DLL

    我想获取为给定进程加载的所有 dll 的列表 我目前正在使用 NET框架4 0 我知道有一个bug https connect microsoft com VisualStudio feedback details 546430 syste
  • 关于 FirstOrDefault 或 SingleOrDefault

    FirstOrDefault 或 SingleOrDefault 将返回什么类型的数据 假设我的查询返回 3 条记录 例如 empid ename salary 1 joy 1500 2 rob 4500 3 jen 6500 所以如果我们
  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • 使用客户端 hello 消息进行 TLS 协议检测

    我需要检测网络流量中的 https 数据包 到目前为止 我将所有 443 标记为 https 但我不想再在这种情况下使用端口信息 检查客户端问候消息是否足够 Check 22 and version info 0300 0301 or 03
  • 通过开源 PCL 使用 API 查看 3D 点云

    我使用 ToF 飞行时间 相机来获取 XYZ 格式的深度数据 为了实现 3D 点云的可视化目的 我想使用开源 PCL 提供的 API 网址为http pointclouds org documentation tutorials pcl v
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 我可以创建一个 List> 吗?

    我正在尝试创建一个列表WeakReference使用 4 5 泛型实现 这样我就可以避免类型检查和转换WeakReference目标 但 WeakReference

随机推荐

  • Python 异常传播

    我正在构建一个工具 当异常向上传播时 有关异常上下文的新数据将添加到异常中 问题是 当异常到达顶层时 所有额外的上下文数据都在那里 但只显示最新的堆栈跟踪 有没有一种简单的方法可以让异常显示抛出异常的原始堆栈跟踪而不是最后一个堆栈跟踪 或者
  • 无法在导入请求时从“集合”导入名称“映射”[重复]

    这个问题在这里已经有答案了 Python版本 Python 3 10 4 画中画版本 pip 22 0 4 所以我试图用套接字制作一个小项目 我添加了一个上传文件的功能 但是每当我导入请求时 它都会抛出此错误 下面是我运行的代码 Trace
  • USB 控制传输能否保证交付?

    USB 2 0 指定 http www usb org developers docs usb20 docs 4 种传输类型 第 5 4 节传输类型 控制转移 同步传输 中断传输 批量转账 第 5 8 节规定批量转账提供 在带宽可用的基础上
  • 如何将数据从一种表单发送到另一个类的函数

    我知道如何将数据从一种表单传递到另一种表单 但如何将数据从一种表单传递到类 这是我想要传递的数据form1上课问题 string GrpID somevalue string DurationID somevalue 我搜索过但没有得到确切
  • Android java 设置图像资源

    我对此有很大的了解 if num1 getText equals 0 num1 setText 1 ImageView hpdown1 ImageView findViewById R id hair hpdown1 setImageRes
  • 通过代码使用 NHibernate 映射:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“DietUser”中插入标识列的显式值

    我花了一段时间才找到这个问题的答案 所以我想分享这份爱 当通过 SQL Server 代码使用 NHibernate 的新映射时 我无法保存实体 保存实体时 会引发 System Data SqlClient SqlException 并显
  • 我们应该在 C++ 中使用 exit 吗?

    根据C 参考 exit正常终止进程 执行常规清理 用于终止程序 正常的程序终止执行以下操作 以相同的顺序 与当前线程关联并具有线程存储的对象 持续时间被破坏 仅限 C 11 具有静态存储的对象 持续时间被破坏 C 并且使用 atexit 注
  • 如何更改 pine 脚本中函数的全局变量?

    我正在尝试编写一个脚本来获得 9 个级别的江恩平方 我已经用其他语言完成了它 但无法理解此处的 pine 脚本 它说无法修改函数中的全局变量 有什么解决方案可以获取这里的值是我的脚本 version 4 study title Volume
  • Xcode 5.1 破坏了一些测试

    自从更新到 Xcode 5 1 以来 我在尝试运行单元测试 XCTestSuite 时遇到了错误 当我运行单独的测试方法时 出现错误Error while reading test scope bundle在控制台上没有结果 当我运行测试文
  • 如何在整个组织内共享数据

    组织在多个部门和应用程序之间共享关键数据有哪些好方法 举个例子 假设有一个主要应用程序和数据库来管理客户数据 组织中还有十个其他应用程序和数据库读取该数据并将其与自己的数据关联起来 目前 这种数据共享是通过数据库 DB 链接 物化视图 触发
  • 如何以最有效的方式将图像转换为字符串?

    我想将图像文件转换为字符串 以下作品 MemoryStream ms new MemoryStream Image1 Save ms ImageFormat Jpeg byte picture ms ToArray string formm
  • 如果索引列不同,则对一列的值求和?

    当索引列不同时 如何对一列中的值求和 最初 我有这样的 SQL 查询 SELECT COALESCE SUM ISNULL cast Quantity as int 0 0 AS QuantitySum FROM Records 也尝试这样
  • CDate 可以在没有 for 循环的 Range 上使用吗?

    我有一个列 其格式如下 Range A A NumberFormat dd mm yyyy 现在 我正在寻找一个有效的版本 For k 1 To Range A1 End xlDown Row from first to last row
  • 使用 zkcli 从 ZooKeeper 删除/删除 Solr 配置?

    我们在 ZK 中有一些旧的 Solr 配置 我们需要清理 删除 配置位于 configs AAA configs BBB 等 configs 下还有其他配置 Solr zkcli sh 脚本和文档没有提供删除配置的指导 唯一看起来明显的是
  • 获取当前活动 Xamarin 表单

    我使用 Leadtools SDK 进行条码阅读器 当我尝试获取当前活动时 它给我 null 这是我的代码 Stream resourceStream new MemoryStream Droid MainActivity activity
  • Thymeleaf:如何使用 Thymeleaf 在 JavaScript 中使用布尔运算符

    我正在使用 thymeleaf 在 javascript 中使用th inline javascript 但是当我们在 javascript thymeleaf 中添加布尔条件时 会抛出异常 如下所示 org xml sax SAXPars
  • 如何修复这个批处理文件? (打字机效果)

    我想让批处理脚本具有打字机风格 效果 同时删除文件并显示回声和其他内容 我希望它看起来像这样 Write1 echo Deleting Prefetches del s q C Windows Prefetch JAVAW pf echo
  • 在运行时根据请求参数创建EF Core DbContext

    背景 我们正在使用 ASP Net Core 和 Entity Framework Core 2 2 构建一个 Web 应用程序 我们正在连接到旧数据库 设置是有 16 个数据库 全部具有完全相同的架构 保存不同的上下文数据 我们无法改变这
  • Ctrl+M 使用 Sublime+Linux 运行 Makefile

    我目前正在考虑从 Pluma 以前的 gEdit 切换到 Sublime Text 到目前为止 我从 Sublime Text 中看到的内容非常好 I currently test Submlime Text 2 and would lik
  • 为什么 C 类型泛型表达式不能与 C++ 兼容?

    我似乎记得从一些可靠来源 即委员会成员在非官方渠道中发言 听到过模糊的评论 即 C 类型泛型表达式不会添加到 C 中 因为它们不能添加 据我所知 与 C 模板和重载相比 类型泛型表达式非常有限 但不存在需要定义为特殊情况的交互潜力 类型通用