C++ 模板函数参数推导和函数解析

2024-01-24

今天我只想提出一个关于C++模板函数参数推导和C++ 11中模板函数重载解析的问题(我使用的是vs2010 sp1)。 我定义了两个模板函数,如下所示:

功能#1:

template <class T>
void func(const T& arg)
{
    cout << "void func(const T&)" <<endl;
}

函数#2:

template <class T>
void func(T&& arg)
{
   cout << "void func(T&&)" <<endl;
}

现在考虑以下代码:

int main() {
    //I understand these first two examples:

    //function #2 is selected, with T deduced as int&
    //If I comment out function #2, function#1 is selected with
    //T deduced as int
    {int a = 0; func(a);}

    //function #1 is selected, with T is deduced as int.
    //If I comment out function #1, function #2 is selected,
    //with T deduced as const int&.
    {const int a = 0; func(a);}

    //I don't understand the following examples:  

    //Function #2 is selected... why?
    //Why not function #1 or ambiguous...
    {func(0);}

    //But here function #1 is selected.
    //I know the literal string “feng” is lvalue expression and
    //T is deduced as “const char[5]”. The const modifier is part
    //of the T type not the const modifier in “const T&” declaration. 
    {func(“feng”)}

    //Here function#2 is selected in which T is deduced as char(&)[5]
    {char array[] = “feng”; func(array);}
}

我只是想知道在这些场景下指导函数重载解析背后的规则。

我不同意下面的两个答案。我认为 const int 示例与文字字符串示例不同。我可以稍微修改一下#function 1,看看推导出来的类型到底是什么

 template <class T>
 void func(const T& arg)
 {
    T local;
    local = 0;
    cout << "void func(const T&)" <<endl;
 }
 //the compiler compiles the code happily 
 //and it justify that the T is deduced as int type
 const int a = 0;
 func(a);

 template <class T>
 void func(const T& arg)
 {
T local;
Local[0] = ‘a’;
cout << "void func(const T&)" <<endl;
 }
 //The compiler complains that “error C2734: 'local' : const object must be     
 //initialized if not extern
 //see reference to function template instantiation 
 //'void func<const char[5]>(T (&))' being compiled
  //    with
  //    [
  //        T=const char [5]
  //    ]

 Func(“feng”);

在 const int 示例中,“const T&”声明中的 const 修饰符吞噬了 const int 的“常量性”;而在文字字符串示例中,我不知道“const T&”声明中的 const 修饰符去了哪里。声明一些像 int& const 是没有意义的(但是声明 int* const 是有意义的)


这里的技巧是const。 F1 和 F2 都可以接受任何类型的任何值,但一般来说 F2 是更好的匹配,因为它是完美转发。所以除非该值是const左值,F2 是最佳匹配。然而,当左值为const,F1 是更好的匹配。这就是为什么它是 const int 和字符串文字的首选。

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

C++ 模板函数参数推导和函数解析 的相关文章

随机推荐

  • Meteor:从客户端上传文件到 Mongo 集合 vs 文件系统 vs GridFS

    Meteor 很棒 但它缺乏对传统文件上传的原生支持 有多种选项可以处理文件上传 来自客户 可以使用以下方式发送数据 Meteor call saveFile data 或 collection insert file data POST
  • 查找 maven 用于运行 testng 测试用例的类路径

    我可以使用 maven 的哪些选项来确定 maven 正在使用哪个类路径运行 testng 测试用例 您没有提供 Maven 版本 但至少在 3 x 也可能是 2 x 中您可以使用 X 调试 选项运行命令 这样 测试类路径就会在测试运行之前
  • 如何更改默认的WCF服务绑定?

    在我的 WCF 中 我有一些服务 其中之一必须对消息大小有更大的限制 因此我必须创建另一个绑定并更改配置 但是 我在 Web config 中看不到我的服务的任何配置 什么也没有 有什么是默认的吗 那么我可以在哪里更改服务绑定呢 在 WCF
  • 错误:无法访问 com.facebook.imagepipeline.animated.base.AnimatedImage 的 AnimatedImage 类文件未找到

    我收到错误 错误 无法访问 AnimatedImage 未找到 com facebook imagepipeline animated base AnimatedImage 的类文件 尝试运行时https github com WhatsA
  • 使用 C# 创建 Windows 窗体向导

    我是 C Net 中的 Windows 窗体应用程序创建向导的新手 所以我对向导创建没有任何想法 请给我一些关于创建多个向导的想法 问候 拉维 有很多方法可以做到 为每个向导步骤创建一个表单是可能的 但非常尴尬 而且丑陋的是 当用户改变步骤
  • VSTO:应用重点

    有人知道如何查看 VSTO 项目的 Excel 窗口是否处于活动 焦点状态吗 我正在寻找相当于System Windows Window IsActive 我也曾为此感到沮丧 您在 VSTO 应用程序中使用对话框吗 如果是这样 我所做的就是
  • 如何检测滑动手势方向?

    我需要检测我的滑动手势的方向 但我遇到了问题 手势有效 但我不知道如何检测方向 swipeGesture UISwipeGestureRecognizer alloc initWithTarget self action selector
  • 没有System32如何解决“java.lang.UnsatisfiedLinkError:找不到依赖库”?

    我正在 Eclipse 上开发一个 Java 项目 该项目通过 JNI 使用 C OpenCV 库 一些图像处理算法是在本机端使用 OpenCV 实现的 我希望通过 JNI 从 java 中使用它们 我构建了一个 C DLL 项目来链接到
  • 根据环境选择C二进制文件

    我使用特定标志 Os O2 march native 及其组合 编译了代码 以便产生更快的执行时间 但我的问题是我并不总是在同一台机器上运行 因为在我的实验室中有几台不同的机器 有时我在 MacOS 或 Linux 中运行 这两种情况都具有
  • 在 Windows 8 中覆盖证书验证

    我正在尝试在 Windows 8 Consumer Preview 上的 ssl 套接字中使用自签名证书 我收到这个异常 异常 System Runtime InteropServices COMException 0x800B0109 证
  • 验证 cypress 的加载指示器显示

    我有以下规格 context Contact update gt it only Can update contact gt const address new address 123 const cardId c2card 38AF429
  • 如何在实体框架中将 Int 属性替换为 Enum?

    我有一个实体类 它的属性具有数据类型 Int 的基础数据库列 但实际上我希望该属性是一个枚举 有什么方法可以指定该属性返回一个枚举吗 间接地 比如so http weblogs asp net alexeyzakharov archive
  • scrypt 输出的最大长度是多少?

    我想存储一个scrypt http en wikipedia org wiki Scrypt 数据库中的散列密码 我可以预期的最大长度是多少 根据https github com wg scrypt https github com wg
  • 为什么我们需要添加

    为什么我们需要在 Facebook 应用程序中添加这对标签 这对标签有什么用呢 我创建了一个使用 apprequest 的应用程序 即使我没有在脚本前面添加这些标签 它也能正常工作 所以我真的很想知道为什么我们需要添加它们 谢谢 它是 Fa
  • 什么是影根

    在 Google Chrome 的开发者工具中 我看到 shadow root就在下面标签 它有什么作用以及用途是什么 我在 Firefox 和 IE 中都没有看到它 仅在 Chrome 中 这是一个特殊功能吗 如果我打开它 它会显示 an
  • Logback 依赖性阻止 SBT 离线运行

    这是一个细化的上一个问题 https stackoverflow com questions 23014492 sbt 0 13 1 offline更密切地归因于问题 我正在尝试确认我可以离线运行我的 SBT 项目 我可以 除非 logba
  • python 2.7中的karger最小切割算法

    这是我的 karger min cut 算法的代码 据我所知 我实现的算法是正确的 但我没有得到正确的答案 如果有人可以检查出了什么问题 我将不胜感激 import random from random import randint loa
  • Plaid 快速入门 - 无法获取 link_token (Python)

    按照以下说明进行操作后https dashboard plaid com overview sandbox https dashboard plaid com overview sandbox 我得到了以下消息在前端 https i sta
  • 如何对值为数组引用的 Perl 哈希进行排序?

    嘿 我只是想知道是否有一个很酷的 单行 可以对保存数组引用的哈希进行排序 所以我的哈希中有一堆键 值 例如 DataBase key value 但是我想按以下方式对哈希进行排序array 0 元素 然后循环遍历它们 我一开始是这样的 fo
  • C++ 模板函数参数推导和函数解析

    今天我只想提出一个关于C 模板函数参数推导和C 11中模板函数重载解析的问题 我使用的是vs2010 sp1 我定义了两个模板函数 如下所示 功能 1 template