是否可以在泛型函数中排除引用参数?

2023-12-24

由于泛型类型参数T可以是任何类型,包括引用,我想知道是否可以选择退出泛型函数中的引用,即能够编写如下内容:

use std::ops::Deref;

fn foo<T: !Deref>(x: T) -> T {}

然而,这是不允许的,并且在解析阶段就已经中断了。

我读到optin_builtin_traits https://github.com/rust-lang/rust/issues/13231,但它只支持选择退出自动特征,所以它也不起作用,因为Deref不是自动特征。

有可能实现这一目标吗?


是的,您可以为此使用自动特征:

#![feature(auto_traits)]
#![feature(negative_impls)]

auto trait NotReference {}

impl<'a, T> !NotReference for &'a T {}
impl<'a, T> !NotReference for &'a mut T {}

fn no_references<T: NotReference>(_: T) {}

fn main() {
    no_references(42); // OK
    no_references(&42); // the trait bound `&{integer}: NotReference` is not satisfied
    no_references("hello"); // the trait bound `&str: NotReference` is not satisfied

    no_references(vec![1, 2, 3]); // OK

    let x = vec![1, 2, 3];
    no_references(x.iter()); // the trait bound `&{integer}: NotReference` is not satisfied in `std::slice::Iter<'_, {integer}>`
}

请注意,这也排除了:

  • 参考文献与'static生命周期,如“hello”调用所示
  • 任何结构contains也是一个参考,如iter() call

我可能会排除一些终生问题。

实际上,这就是'static绑定的作用是:

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

是否可以在泛型函数中排除引用参数? 的相关文章

随机推荐

  • Node js:libuv 线程池如何工作?

    我正在学习 Node Js 我了解 Node js 的核心是基于事件循环的反应器模式 当任何事件发生时 它都会进入事件队列 然后在运行任务结束后被堆栈拾取 如果事件是非阻塞事件 则会发生这种情况 但如果它是阻塞请求 则事件循环将其传递给来自
  • 如何使用复选框在 mySQL 中输入 true (1) 或 false (0) 并在 php / html 表单中显示为选中状态?

    我有一个带有字段名称的表Shift Trig这意味着有一个true or false以 a 的形式输入的值1 or 0 我有一个 html 表单 每行都有一个复选框 选中时应输入1进入现场 我还希望该复选框能够反映存储在中的当前值Shift
  • 删除 Three.js 中相邻的面

    我正在尝试优化一个场景 其中我根据图像的像素数据渲染立方体 http jsfiddle net majman 4sukB http jsfiddle net majman 4sukB 该代码只是检查图像中的每个像素并相应地创建和定位立方体网
  • 如何将程序加载到内存中与预期地址不同的地址?

    通常 用户程序二进制文件将加载到低地址 通常约为0x400000 在程序地址空间中 该空间将在elf二进制 对于 Linux 我们能否强制用户二进制文件加载到高地址 可能在2GB地址范围 其中libc或加载其他此类库 我尝试在网上寻找解决方
  • 创建 CSS Sprite :hover 滚动图像链接

    我有一个问题希望能得到答案 我正在尝试从头开始创建一个网站 不使用 Dreamweaver Expression Web 等 我只使用记事本 我想要完成的是在标签内创建两个导航链接作为翻转 CSS 精灵图像 使用伪类元素 hover 我稍后
  • mex 将向量从 c++ 从 mex 函数传输到 matlab

    我试图通过用 C 编写一些函数并使用 mex 接口来集成它们来加速我的 Matlab 程序 我在 C 向量中得到了结果 我想将它转移到 MATLAB 中的数组 我知道我应该重定向 plhs 0 to the vector 当我完成类似的事情
  • 如何在tensorflow中读取.mat文件格式?

    Tensorflow 中的 Reader 共有三个版本 tf TFRecordReader 用于读取TFRecord文件 tf FixedLengthRecordReader 用于读取二进制文件 tf TextLineReader 用于读取
  • Qt Creator - 如何启用浮动 IDE 布局?

    我是长期用户内河码头 C Builder窥视Qt创建者 版本 4 4 0 目前看来非常适合所有类型的 C 开发任务 因此可能非常高效 不幸的是有一个major与相比 缺点显着减慢了我的速度C Builder 我找不到任何可以重新排列的设置Q
  • SearchControls.setTimeLimit() 是否处理读取超时?

    我遇到一个问题LdapContext search 针对目录有时会永远挂起 我尝试提供一个SearchControls我调用的对象setTimeLimit 10000 但问题仍然发生 鉴于此 我现在的想法是 SearchControls 对
  • UNIX 僵尸和守护进程

    据我所知 当进程不能很好地清理 其资源没有被回收 收获 时 就会创建僵尸 调用 fork 创建新进程后 父进程应始终对该进程调用 waitpid 来清理它 我还了解到 守护进程是通过分叉一个本身由 fork 创建的子进程 然后让该子进程死亡
  • 如何通过拨动开关应用设置? [复制]

    这个问题在这里已经有答案了 可能的重复 谁能告诉我如何使用开关 https stackoverflow com questions 5639372 can anyone tell me how to use switch 嗨 我有两个视图
  • CSS线性渐变不准确?

    对于我的应用程序 我希望制作一个可以提供 0 度到 360 度之间任何色调的调色板 我目前正在使用此代码来制作调色板 我们以色调 120 纯绿色 为例 function drawPalette hue var ctx document qu
  • 领域驱动设计和实体框架 4.1(代码优先)

    我目前正在学习领域驱动设计开发方法 并使用 Tim McCarthy 编写的 NET 领域驱动设计与 C 一书作为指南 这本书确实很有帮助 但在使用实体框架时我变得有点困惑 特别是 4 1 中提供的代码优先方法 根据书中的示例 分层架构方法
  • 从包含合并单元格的表格中删除范围

    基本上 我想要完成的是 删除表中从光标在表中的位置到表末尾的所有行 问题是该表包含垂直合并的单元格 因此当我尝试执行以下操作时 For i Selection Tables 1 Rows Count To Selection Cells 1
  • 如何使用 Moq 库创建 SerialPort 模拟?

    我必须编写大量处理串行端口的代码 通常 电线的另一端会连接一个设备 我通常会创建自己的模拟来模拟它们的行为 我开始考虑 Moq 来帮助我进行单元测试 当您只需要一个存根时 使用它非常简单 但我想知道是否可能 如果可以 如何为硬件设备创建一个
  • 在 Mono 中保留退出代码

    我有一个使用 C 编写的简单应用程序 它通过命令行参数接受操作数 并通过退出代码报告成功或失败 当通过批处理文件在 Windows XP 上运行时 MyProg exe Snip Command line Params echo error
  • 获取chrome的控制台日志

    我想构建一个自动化测试 所以我必须知道chrome控制台中出现的错误 有一个选项可以获取控制台中出现的错误行吗 为了查看控制台 右键单击页面中的某个位置 单击 检查元素 然后转到 控制台 我不懂 C 但这是完成这项工作的 Java 代码 我
  • iTextSharp生成PDF:如何将pdf发送给客户端并添加提示?

    我使用 iTextSharp 生成了一个 pdf 当它创建时 它会自动保存在服务器上我的代码中提供的位置 而不是客户端 当然不会告诉用户任何信息 我需要将其发送给客户端 并且需要提示一个对话框来询问用户想要将其pdf保存在哪里 请问我该怎么
  • 我们是否应该在 JavaFX 自定义控件中使用 FXML?

    似乎很想问这个问题 我认为使用 FXML 来编写我们的自定义组件显然是正确的方法 但从ControlsFX JFXextras甚至 掌握JavaFX8控件 一书中我们可以看到 在自定义控件中都没有使用或提及FXML的使用 尽管如此 官方文档
  • 是否可以在泛型函数中排除引用参数?

    由于泛型类型参数T可以是任何类型 包括引用 我想知道是否可以选择退出泛型函数中的引用 即能够编写如下内容 use std ops Deref fn foo