【发布时间】:2020-08-12 18:08:07
【问题描述】:
#include <iostream>
#include <type_traits>
template <class... Ts>
struct test {
static void foo(const std::remove_reference_t<Ts>&...) {
std::cout << "1\n";
}
template <class... Us>
static void foo(Us&&...) {
std::cout << "2\n";
}
};
int main() {
test<int&, double&>::foo(1, 1.0);
}
上面的代码打印“2”。为什么第二个重载被认为是更好的匹配?
第一个归结为foo(const int&, const double&),它是一个常规函数,所以应该首选它,不是吗?
我猜这不是“完全匹配”,但这里到底是什么不“完全”?
【问题讨论】:
-
你用的是什么编译器? gcc 和 clang print 1.
-
为我打印
1godbolt.org/z/P69d7q -
Us&- 这不是转发参考 -
请注意,链接中的代码与问题中的代码不匹配。问题中的函数接受
Us&...,而链接中的函数接受Us&&...。 -
@cigien 看起来更像是 OP 只是在问题中键入了代码,并且很困惑为什么通用引用重载优于 const 引用重载。
标签: c++ language-lawyer overload-resolution