c++ - 重载解析规则中更专业化模板的意义
问题描述
最近我发布了这个问题:在 clang 上的歧义运算符重载,由于与在混合成员和非成员二元运算符时,clang 错误地报告歧义而被关闭?
在阅读了其他问题的答案后,我想我仍然对更专业的含义感到困惑。因此,根据我在那里读到的内容,我的代码中的成员运算符应该解决这个问题:
template <class U>
TVector3<T>& TVector3<float>::operator*=(const U ) { return *this; }
在名称查找过程中,为了重载解析,我会得到这两个候选者:
template <class U>
TVector3<T>& operator*=(TVector3<float>&, const U ) { return *this; }
template <typename T>
TVector3<T>& operator*=(TVector3<T>& v, const TMatrix3<T>& ) { return v; }
为什么他们都同样专业化?
是因为在第一个重载中第一个参数更专业,而在第二个重载中第二个参数更专业?所以基本上他们之间的关系?
另一方面,如果我将operator*=
Vector 类的成员转换为自由函数,则重载决议集将是:
template <class T, class U>
TVector3<T>& operator*=(TVector3<T>& v, const U ) { return v; }
template <typename T>
TVector3<T>& operator*=(TVector3<T>& v, const TMatrix3<T>& ) { return v; }
在这种情况下,两个重载的第一个参数同样特化,但第二个重载的第二个参数更加特化,因此在这种情况下没有歧义。
我的理解正确吗?
解决方案
推荐阅读
- flutter - Firebase 流获取我在控制台中看不到的数据
- android - 如何在 Kotlin 中使用 when 语句?
- python - 即使输入没有下降趋势,我的自动 ARIMA 也会显示下降趋势
- c# - EFMigrationsHistory 表为空
- python - Heroku Postgres 数据库在我的 Django 项目中不起作用
- javascript - 如何使用 svelte-routing 在当前路由器中导航?
- css - Bootstrap 5个浮动标签重叠
- flutter - 在 Flutter 中将数据从一个小部件传输到整个项目
- python - 返回一个数据框作为结果 Flask
- tensorflow - ValueError: 无法解析模型:pybind11::init(): factory function returned nullptr