代码之家  ›  专栏  ›  技术社区  ›  AhSeng Fan

模板演绎不明确

  •  1
  • AhSeng Fan  · 技术社区  · 7 年前

    我现在对c++的右值概念感到困惑。 我编写了下面的代码来检查我对rvalue的理解是否正确。但事实证明并非如此。我希望输出是 "T&&" 但是相反 "T" 已打印。为什么?

    使其打印 “T&” ,代码的哪一部分需要更改?

    非常感谢。

    template <typename T>
    struct printer {
        printer(T t)
        { 
            cout << "T" << endl;
        }
    };
    
    template <typename T>
    struct printer<T&&> {
        printer(T&& t)
        {
            cout << "T&&" << endl;
        }
    };
    
    template <typename T>
    struct printer<T&> {
        printer(T& t)
        {
            cout << "T&" << endl;
        }
    };
    
    int main()
    {
        printer a(make_unique<int>(5));
    
        return 0;
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Jarod42    7 年前

    “T”已打印。为什么?

    自动扣除指南仅考虑主模板,而不考虑专门化,因此仅

    template <typename T> printer(T) -> printer<T>;
    

    已生成。

    要使其打印“T&”,代码的哪一部分需要更改?

    您可以添加扣款指南:

    template <typename T> printer(T&&) -> printer<T&&>;
    

    Demo

    注:该扣除指南也适用于 printer<T&> .
    你不会有 printer<T> 还有那本指南。