模板推导中的隐式类型转换
在 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标量
此失败背后的原因是模板参数推导不考虑用户 -定义的转换。在这种情况下,从 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
总之,模板参数推导不会自动应用用户- 定义的转换。要在模板参数推导中使用用户定义的转换,必须在调用方显式转换参数、使用推导指南(如果适用)或显式实例化所需类型的模板。
以上是为什么模板推演中隐式类型转换失败?的详细内容。更多信息请关注PHP中文网其他相关文章!