重载模板函数未为特定类型选择正确的版本

Overloaded template function doesn't select the correct version for a specific type

本文关键字:选择 类型 版本 函数 重载      更新时间:2023-10-16

情况是:我有一个通用函数,但想要特定类型的更改版本。

我会本能地编写一个widget const& w参数,以便能够通过引用接受任何小部件,但在这种情况下无法编译,因为编译器忽略了特定的重载 (2( 并使用泛型 (1(。如果我删除 (2( 参数中的常量,它确实会编译,为什么会这样?

戈德博尔特

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成员变量。它有widget_size,这会导致编译错误。

int get_size(Arg && arg) {
return arg.widget_size; // See this
}

如果我删除 (2( 参数中的常量,它确实会编译,为什么会这样?

这是因为get_size(w);开始匹配版本 2,从而省略了编译器检查版本 1 中widget_size的任何需要。