首页 > 后端开发 > C++ > 正文

为什么模板推演中隐式类型转换失败?

Barbara Streisand
发布: 2024-10-31 19:31:30
原创
231 人浏览过

 Why Does Implicit Type Conversion Fail in Template Deduction?

模板推导中的隐式类型转换

在 C 语言中,隐式类型转换机制在模板参数推导中起着至关重要的作用。然而,在某些情况下,它可能会导致意外的行为,如下面的代码片段所示:

<code class="cpp">#include<iostream>
using namespace std;

template<typename Dtype>
class Scalar{
public:
  Scalar(Dtype v) : value_(v){}
private:
  Dtype value_;
};

template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
  cout << "ok" << endl;
}

int main(){
  int a = 1;
  func(a, 2); // Incorrect conversion
  //int b = 2;
  //func(a, b); // Also incorrect
  return 0;
}
登录后复制

在提供的代码中,目标是通过将 int 隐式转换为来调用模板函数 func标量目的。然而,令人惊讶的是,由于模板参数推导/替换第一次调用 func(a, 2) 失败,代码无法编译。

此失败背后的原因是模板参数推导不考虑用户 -定义的转换。在这种情况下,从 int 到 Scalar 的转换需要进行。是用户定义的转换,在模板参数推导过程中不会自动应用。

要解决此问题,有几个选项:

  • 显式转换在调用方站点: 通过手动提供 Scalar 强制转换;调用处具有所需值的对象:

    <code class="cpp">func(a, Scalar<int>{2}); </code>
    登录后复制
  • 推导指南: 为 Scalar 定义推导指南并调用 func:

    <code class="cpp">func(a, Scalar{2}); // C++17 only</code>
    登录后复制

    这种方法依赖于默认的推导指南,在这种情况下就足够了。

  • 显式实例化:显式实例化所需类型的 func 模板:

    <code class="cpp">func<int>(a, 2); </code>
    登录后复制

    仅当 Scalar::Scalar(T) 不显式时才有效。

  • 总之,模板参数推导不会自动应用用户- 定义的转换。要在模板参数推导中使用用户定义的转换,必须在调用方显式转换参数、使用推导指南(如果适用)或显式实例化所需类型的模板。

    以上是为什么模板推演中隐式类型转换失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!