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&
是魔法。