缩写函数模板与带有转发引用参数的函数模板

2023-12-23

两者有什么区别带有转发参考参数的函数模板

template<typename T>
void Universal_func(T && a)
{
}

and 缩写函数模板?

void auto_fun(auto && a)
{
}

我可以更换吗Universal_func with auto_fun? Is Universal_func a of auto_fun或者它们相等吗?

我已经测试了下面的程序。看来两者是一样的。

template<typename T>
void Universal_func(T && a)
{
}

void auto_fun(auto && a)
{
}

int main()
{
  int i;   
  const int const_i = 0; 
  const int const_ref =const_i; 
  //forwarding reference template function example  
  Universal_func(1); //call void Universal_func<int>(int&&)
  Universal_func(i);//call void Universal_func<int&>(int&):
  Universal_func(const_i); //call void Universal_func<int const&>(int const&)
  Universal_func(const_ref);//call void Universal_func<int const&>(int const&)

  //auto calls  
  auto_fun(1); //call void auto_fun<int>(int&&)
  auto_fun(i);//call void auto_fun<int&>(int&):
  auto_fun(const_i); //call void auto_fun<int const&>(int const&)
  auto_fun(const_ref);//call void auto_fun<int const&>(int const&)
  return 0;
}

Universal_func and auto_fun推导并扩展为类似的函数。

void Universal_func<int>(int&&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void Universal_func<int&>(int&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void Universal_func<int const&>(int const&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void auto_fun<int>(int&&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void auto_fun<int&>(int&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void auto_fun<int const&>(int const&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret

有什么区别吗?标准怎么说?


auto函数参数中的内容还不是标准 C++ 的一部分,但 GCC 的一些最新版本允许将其作为扩展,作为其对 Concepts TS 支持的一部分。

Concepts TS 将此构造称为缩写函数模板(虽然它曾经被称为通用函数,我认为这个术语太笼统了)。这些规则可能太大,无法转入这个答案,但请查看[dcl.fct]/16-19 in 这个草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4553.pdf对于所有血淋淋的细节。

第 16 段提供了一个不错的概述:

缩写函数模板是一个函数声明,其参数类型列表包括 一个或多个占位符 (7.1.6.4)。缩写的函数模板相当于一个函数 模板(14.6.6),其模板参数列表包括一个发明的模板参数 参数声明子句中每次出现占位符时,按出现顺序排列, 根据以下规则。 [注:还发明了模板参数来推导 当声明的类型包含占位符时,变量的类型或函数的返回类型 (7.1.6.4.1)。 ——尾注]

根据该草案中规定的规则,您的两个定义在功能上是等效的。

我们使用带有占位符参数的函数:

void auto_fun(auto && a)
{
}

并发明一个模板参数来替换它:

template <typename T>
void auto_fun (T && a)
{
}

如您所见,这与不带占位符的函数具有相同的签名:

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

缩写函数模板与带有转发引用参数的函数模板 的相关文章

随机推荐

  • 在 Common Lisp 中,如何格式化浮点并指定分组、群聊和小数分隔符

    假设我有浮点数1234 9 我想将其格式化为1 234 90 是否有格式指令组合 D 可以处理分组和群聊 仅处理整数 F根本不处理分组 据我所知 没有人可以改变小数点 to 我看到的唯一解决方案是使用 D对于整数部分数字分组并将其与 和小数
  • 如何覆盖 celery 任务的后端

    我们使用 Redis 作为结果后端 然而 对于一项任务 我们希望覆盖它以使用 RabbitMQ 的文档任务后端 http celery readthedocs org en latest userguide tasks html Task
  • 在 Google 表格之间自动复制数据

    我正在寻找一些帮助来自动在谷歌表格之间复制数据 我有一张名为 当前数据 的表格 该工作表的 A F 列中包含数据 带标题 A 列包含用户名 B F 列将包含使用以下公式从 Instagram com 提取数据的公式 值 REGEXEXTRA
  • 如何在 Visual Studio 选项中禁用设计模式

    如何在没有 Visual Studio 的情况下仅使用 XAML Code Viewload设计模式 我每次都需要禁用设计模式 我在我的选项中找不到这个 source biggle de http www biggle de allView
  • UWP 应用程序是否需要 Windows 应用商店?

    如果是 我如何使用它来开发内部的东西 我不想在商店里看到它 它永远不应该在企业外部看到 编辑 侧载是唯一的方法吗 侧面加载并不是在 UWP 中运行应用程序的唯一方法 您还可以创建自己的安装程序 在 Visual Studio 中转到 项目
  • 将 div 浮动在右上角而不重叠同级标题

    有一个div and a h1在一个部分中 如何将 div 浮动在右上角而不与标题文本重叠 HTML 代码如下 section h1 some long long long long header a whole line 1 2 3 4
  • 数据表和服务器端处理 - 按需加载

    我已经使用 DataTables 构建了简单的表 并且成功连接了服务器端脚本以用数据填充我的表 在我的表格上方 有 2 个复选框和 2 个日期选择来指定过滤条件 当我的页面加载时 我会填充表格 因为在启动时数据表正在从服务器提取第一页数据
  • phpMyAdmin 配置在 Centos 6.5 上不起作用

    最近使用 yum 安装了 phpMyAdmin yum install phpmyadmin phpmyadmin 已安装到 usr share phpMyAdmin 但那里没有配置文件 有一个 config inc php 文件位于 et
  • 有没有办法将嵌套记录选择到表中?

    我在 Bigquery 中有一张表 T 其中包含简单字段和一个嵌套字段 我想有效地 select from T where 并将结果存储在新表 U 中 我希望 U 具有与 T 相同的架构 包括嵌套字段 有没有办法在 Bigquery 中执行
  • 定位 window.location.pathname

    我有一个类似于此的网址 www mysite com products 我用它来测试路径名 if products test window location gaq push trackPageview products landing 但
  • 更改 Google Cloud SQL 实例的 TCP 端口:3306

    如何更改 Google Cloud SQL 实例上的 TCP 端口 Google MySQL 服务器正在侦听端口 3306 这在我的环境中不起作用 端口号需要不同 我不知道如何在开发者控制台 云存储中更改此设置 我确实看到了文档网络和防火墙
  • C++ 成员变量的类型名

    是否可以获取成员变量的类型名 例如 struct C int value typedef typeof C value type something like that Thanks C 03 中没有 C 0x介绍decltype type
  • MapStruct:对象的映射列表,当对象由两个对象映射时

    假设我有这样的映射 Mapping source parentId target parent id Child map ChildDto dto Parent parent 现在我需要将 ChildDto 列表映射到 Child 列表 但
  • 从 BigQuery 导入到 R 时的特殊字符

    我有一个脚本用于废弃一些推文并将结果保存到 Google BigQuery 当我看到存储的数据时 像 这样的特殊字符会正确显示 但是当我尝试再次将数据导入 R 时 它们会被一些奇怪的字符替换 这是一个例子 Create df id twee
  • 如何在Word文档中插入Image对象作为图片

    所以我有这个函数来生成和返回我的图像 bmp 格式 我想把它放到一个word文档中 我在看InlineShapes AddPicture但只需要一个string参数 这要求我物理保存图片 然后将图片的路径作为参数提供给 AddPicture
  • 为什么这个 Spring AOP 切入点没有被触发?

    我正在编写非常基本的基于模式的 Spring AOP 这是 xml
  • 如何将一个大数组分割成更小的数组?

    给定一个大数组 如何将其拆分为较小的数组 并将较小数组的大小指定为方法的参数 例如 给定数字 Split 的实现会是什么 int numbers new int 7845 int sectionedNumbers numbers Split
  • 贵公司如何部署其软件?

    我目前正在进行一个短期研究项目 我工作的公司有一个非常繁重的发布流程 随着时间的推移 情况变得越来越糟 我们在每个版本中遇到越来越多的问题 这开始严重影响我们的交付时间表和每个版本的质量 我们提供了一个大型 SAAS 产品 该产品部署到互联
  • cudaFree 不释放内存

    下面的代码计算两个向量 a 和 b 的点积 正确的结果是8192 当我第一次运行它时 结果是正确的 然后 当我第二次运行它时 结果是之前的结果 8192 等等 1st iteration result 8192 2nd iteration
  • 缩写函数模板与带有转发引用参数的函数模板

    两者有什么区别带有转发参考参数的函数模板 template