模板演绎暧昧

时间:2018-01-18 14:49:42

标签: c++ c++17

我现在对c ++的rvalue概念感到困惑。 我写下面的代码来检查我对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 个答案:

答案 0 :(得分:3)

  

“T”被打印出来。为什么呢?

自动扣减指南仅考虑主要模板,而不是专业化,因此仅考虑

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

已生成。

  

要打印“T&amp;&amp;”,哪部分代码需要更改?

您可以添加演绎指南:

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

Demo

注意:扣除指南也适用于printer<T&> 你不会再使用该指南printer<T>了。