c++ - 重载的模板函数没有为特定类型选择正确的版本
问题描述
情况是:我有一个通用函数,但想要一个特定类型的更改版本。
我会本能地编写一个widget const& w
参数,以便能够通过引用接受任何小部件,但在这种情况下不会编译,因为编译器忽略了特定的重载 (2),而是使用了泛型 (1)。如果我删除 (2) 的参数中的 const,它会编译,这是为什么呢?
struct widget {
int widget_size;
};
// (1)
// compiler uses this instead of (2)
template <typename Arg>
int get_size(Arg && arg) {
return arg.size;
}
// (2)
int get_size(widget const& arg) {
return arg.widget_size;
}
int main() {
widget w;
get_size(w);
}
解决方案
因为编译器忽略了特定的重载。
请注意,版本 2 是更好的匹配,因为传递的参数缺少const
关键字,而版本 1 也缺少const
关键字。
在这种情况下不会编译。
Widget
类中没有size
成员变量。它 got widget_size
,这导致编译错误。
int get_size(Arg && arg) {
return arg.widget_size; // See this
}
如果我删除 (2) 的参数中的 const,它会编译,这是为什么呢?
这是因为get_size(w);
开始匹配版本 2,因此无需编译器widget_size
在版本 1 中进行检查。
推荐阅读
- amazon-web-services - 有没有办法在 AWS 内部路由网络流量?
- wmi - 在 UEFI 中实现 ACPI 功能
- reactjs - React PWA 中的 Firebase 云消息传递错误
- javascript - 使用 Facebook 登录 AWS Cognito
- html - html div元素透明
- c - Makefile链接问题
- javascript - React-router-dom 路由器不工作。仅跳转到 404 页面
- excel - 将 Excel 中的日期格式从 mm-dd-yy hh:mm 更改为 dd-mm-yy hh:mm
- python - 我怎样才能让 80 位浮点数在 numpy 中工作
- audio - 如何使用 Node.js 设置 Stun 服务器