首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当使用debug_rep(&s)调用template <typename T> string debug_rep(T *p)时,为什么T不是string*

当使用debug_rep(&s)调用template <typename T> string debug_rep(T *p)时,为什么T不是string*

在这个调用中,&s是一个指向string对象s的指针,而不是一个指向指针的指针。因此,T被推导为string,而不是string*

模板函数debug_rep的定义中,T是一个模板参数,它可以代表任意类型。当我们调用debug_rep(&s)时,编译器会尝试推导出T的具体类型。根据C++的类型推导规则,如果传入的实参是一个指针,那么推导出的类型将是指针所指向的类型,而不是指针本身的类型。

因此,T被推导为string,而不是string*。这意味着在debug_rep函数中,p的类型将是string*,而不是string**

这个问题的答案可以总结如下:

  • 当使用debug_rep(&s)调用template <typename T> string debug_rep(T *p)时,T不是string*,而是string
  • 这是因为&s是一个指向string对象s的指针,而不是一个指向指针的指针。
  • 根据C++的类型推导规则,当传入的实参是一个指针时,推导出的类型将是指针所指向的类型,而不是指针本身的类型。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动应用分析(MTA):https://cloud.tencent.com/product/mta
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++:19---重载与模板、模板特例化

(包括指针类型),debug_rep(T*)只适用于指针类型,因此第二版本更适合 有多个重载模板对一个调用提供同样好的匹配,应选择最特例化的版本。...因此存在多个同样好的函数模板,编译器选择最特例化的版本,一个非模板函数比一个函数模板更好 std::string s("hi");std::cout string debug_rep(const T &t);template string debug_rep(T *p);//为了使debug_rep...return debug_rep(string(p));} 通常,如果使用了一个忘记声明的函数,代码将编译失败,但对于重载函数模板的函数而言,则不是这样。...为了指出我们正在实例化一个模板,应使用关键字template后跟一个空尖括号对 templateint compare(const T&, const T&);template

1.4K20
  • 《C++Primer》第十六章 模板与泛型编程

    :string &msg) const; }; 2.2 实例化类模板 使用一个类模板,我们必须提供额外信息,即显式模板实参explicit template argument,编译器使用这些模板实参来实例化出特定的类...对于模板代码来说就不是这么简单,假定T是一个模板类型参数,编译器遇到T::mem代码,它在实例化之前不知道mem是一个类型成员还是一个static数据成员。...函数参数本身是constT的类型推断的结果不会是一个const,const已经是函数参数类型的一部分,因此它不会也是模板参数类型的一部分: template void f2...(s) << endl; // 如果用指针调用, 则两个版本都是可行的 cout << debug_rep(&s) << endl; // 第一个版本的T被绑定到string*, 实例化debug_rep...debug_rep,然后调用print打印结果的string: // 在print调用中对每个实参调用debug_rep template <typename...

    1.9K10

    C++ 学习笔记

    template auto sum(T ...s) {     return (... + s); // ((s1+s2)+s3)... } 4.3 可变参数模板的使用 4.4...hello");     s1.get();  // "hello"     s1.get(); // false } 3.通过依赖于模板参数的对象通过.调用函数模板,需要通过 template...template void passR(T &&t) {     T x; } std::string s("Sjx"); passR(s); // error... T 推断为string &,初始化时必须绑定到对象 7.3 使用 std::ref()和 std::cref() 1.c++11 开始,若模板参数定义为按值传递调用者可以通过 std::cref...} 8.4 SFINAE(替换失败不是错误) SFINAE:函数调用的备选方案中出现函数模板,编译器根据函数参数确定(替换)函数模板的参数类型及返回类型,最后评估替换后函数的匹配程度。

    6.7K63

    C++ Template 基础篇(一):函数模板

    Template 基础篇-函数模板 为什么要有泛型编程 函数模板定义 普通函数模板 成员函数模板 为什么成员函数模板不能是虚函数virtual 实参推断 如何使用 返回值类型也是参数 实参推断的自动类型转换...; } }; Printer p; p.print("abc"); //打印abc 为什么成员函数模板不能是虚函数(virtual)?...int (*pf) (const int&, const int&) = compare; //推断T的类型为int 返回值类型也是参数 一个模板函数的返回值类型需要用另外一个模板参数表示,你无法利用实参推断获取全部的类型参数...; func(i); //调用通用版本,其他函数或者无法实例化或者不匹配 func(&i); //调用指针版本,通用版本虽然也可以用,但是编译器选择最特殊的版本 string s = "abc"; func...(&s); //调用普通函数,通用版本和特殊版本虽然也都可以用,但是编译器选择最特化的版本 func(&s); //调用指针版本,通过告诉编译器我们需要用template不是普通函数 模板函数特化

    1.7K20

    C++:18---函数模板(template)

    一、模板的定义 template 以关键字template开头,后面跟一个模板参数列表,列表里面用逗号将多个模板参数隔开定义的注意事项 模板的编译 编译器遇到一个模板定义,...只有当实例化处模板的一个特定版本,编译器才会生成代码 重点:通常,当我们调用一个函数/定义实例化一个类,编译器只需掌握函数的声明/类的声明即可,因此可以把函数/类的声明放置在头文件,而把函数/类的定义放置在源文件中...return strcmp(p1, p2);}int main(){compare("hi","mom");//编译器会使用字面值常量的大小来代替N和Mreturn 0;} 五、inline、constexpr...则代码的行为是未定义的 template int compare(const T& s1, const T& s2){if (v1 ...v2)return 1;return 0;} 下面我们编写了这个函数模板,也可以用于传入指针也可以正常使用的函数模板(但是还不是最完美的,所以在定义,要考虑各种因素而达到更高的标准) template

    1.1K50

    c++模板与泛型编程

    (p1, p2); } 调用compare("hi", "mom");实例化(编译器会在一个字符串字面常量的末尾插入一个空字符作为终结符): int compare(const char (&p1)[... using twin = pair; twin authors; // authors is a pair template...两个或多个独立编译的源文件使用了相同的模板,并提供了相同的模板参数,每个文件中就都会有该模板的一个实例。 在新标准中,可以通过显式实例化来避免这种开销。...1.6 效率与灵活性 unique_ptr在编译绑定删除器,避免了间接调用删除器的运行时开销。 shared_ptr在运行时绑定删除器,使用户重载删除器更为方便。...(const int&, const int&) int (*pf1)(const int&, const int&) = compare; 无法确定函数指针的唯一类型,会出错,可以通过显式模板实参来消除调用歧义

    60620

    Chapter 5: Rvalue References, Move Semantics, PF

    std::forward的作用是当我们传入的参数是左值,在内部将参数转发到其他函数仍然是按照左值转发(也就是调用左值参数的函数),而当是右值按照右值转发(调用右值参数的函数);仅传入的参数被一个右值初始化过后...上述auto cloneOfP(p)语句似乎应该是调用拷贝构造函数,但是实际上会调用完美转发构造函数,然后会用Person对象去实例化Person的string成员,然而并没有这种匹配规则,马上报错!...... }; 在这种例子下,我们想要的结果是:传入的参数类型是Person,应该调用拷贝构造函数,也就是要禁用模板;否则应该启用模板,将函数调用匹配到通用引用构造函数中。...编码机制是:传递的参数是一个左值,模板参数被推导为左值引用;传递的参数是一个右值,模板参数被推到为一个非引用。...如果将模板函数作为模板函数的参数,同样也无法自动推导出匹配的函数,因为模板函数不是一个函数,而是许多函数 template T workOnVal(T param) {..

    5.1K40

    Modern c++快速浅析

    处理变量,它与auto不同,并不会去忽略掉顶层const,原变量是啥它就是啥•decltype处理函数,它只是获取函数的返回值类型,并不会去调用函数•decltype处理表达式,假设类型为Tstd...HandleData typename 对于刚学习C++不久的人来说,最常见的typename使用场所就是模板了 template template 上例中...num; // 编译时报错,详见下图 typename T::template InArray::ElemT num; } 知乎-C++ 为什么有时候必须额外写...Lambda表达式不会抛出异常,可以使用noexcept修饰[]() noexcept { /* 函数语句 */ }•Lambda表达式没有捕获任何参数,它可以转换成为一个函数指针•Lambda中可以直接使用静态变量以及全局变量...也正因为此调用Lambda对该数据的访问是该数据当前的数值 Constexpr Lambda 此功能需要开启_std:c++17_ 显式constexpr auto lambda = [](int

    19510
    领券