为什么没有在函数模板的前向引用上选择重载?
Why no overload chosen on forward reference for function templates?
片段:
#include <iostream>
template<typename T>
struct Printer{};
template<typename T>
void test(T&&)
{
std::cout << "Primary template called\n";
}
template<typename T>
void test(Printer<T>&&)
{
std::cout << "Specialized template called\n";
}
int main()
{
auto t = Printer<int>{};
test(0);
test(t);
}
这是demo
为什么要打印两次Primary template called
?
如果从第二个模板中删除前向引用,则选择 Printer
重载。
为什么不选择&&
?
转发引用仅适用于 T&&
,不适用于 C<T>&&
或 const T&&
。
test(0); // Call test(T&&) with T=int
test(t); // Call test(T&&) with T=Printer<int>&
片段:
#include <iostream>
template<typename T>
struct Printer{};
template<typename T>
void test(T&&)
{
std::cout << "Primary template called\n";
}
template<typename T>
void test(Printer<T>&&)
{
std::cout << "Specialized template called\n";
}
int main()
{
auto t = Printer<int>{};
test(0);
test(t);
}
这是demo
为什么要打印两次Primary template called
?
如果从第二个模板中删除前向引用,则选择 Printer
重载。
为什么不选择&&
?
转发引用仅适用于 T&&
,不适用于 C<T>&&
或 const T&&
。
test(0); // Call test(T&&) with T=int
test(t); // Call test(T&&) with T=Printer<int>&