为什么没有在函数模板的前向引用上选择重载?

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>&