C++ 为什么在函数模板的正向引用上没有选择重载?
片段:C++ 为什么在函数模板的正向引用上没有选择重载?,c++,overloading,function-templates,forward-reference,C++,Overloading,Function Templates,Forward Reference,片段: #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>&am
#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);
}
#包括
模板
结构打印机{};
模板
无效试验(T&)
{
std::cout转发参考仅适用于T&
,而不适用于C&
或const T&
test(0); // Call test(T&&) with T=int
test(t); // Call test(T&&) with T=Printer<int>&
test(0);//用T=int调用test(T&&)
test(t);//使用t=Printer调用test(t&&)&
&
不绑定左值,t
是左值。&
在您的示例中不是转发引用,它只是一个右值引用。@Evg:为什么它会绑定到第一个模板?因为在t&
中,&
是转发引用,但在打印机&
中,&
是一个转发引用值引用。获得转发引用的唯一方法是写入T&&
。即使const T&&
也不再是转发引用。好吧,我明白了……那么打印机是什么?Printer
用T&
替换为T&
。这里没有魔法。只有T&
是魔法。