尝试实现 std::tie 和 std::tuple 的小版本

Trying to implement a small version of std::tie and std::tuple

所以正如标题所说,我正在尝试实现 std::tiestd::tuple 的一个小版本以供学习。

到目前为止,这是我的代码:

#include <iostream>

using namespace std;

template<typename T1, typename T2>
class Tuple
{
public:
    T1 t1;
    T2 t2;

    template<typename Tr1, typename Tr2>
    Tuple(Tr1 tr1, Tr2 tr2) : t1(tr1), t2(tr2)
    {
    }

    template<typename Tr1, typename Tr2>
    Tuple<T1, T2>& operator =(const Tuple<Tr1, Tr2>& other)
    {
        t1 = other.t1;
        t2 = other.t2;
        return *this;
    }
};

template<typename T1, typename T2>
Tuple<T1&, T2&> Tie(T1& t1, T2& t2)
{
    return Tuple<T1&, T2&>(t1, t2);
}

Tuple<int, int> f()
{
    return Tuple<int, int>(3, 5);
}

int main()
{
    int hi, bye;

    Tie(hi, bye) = f();

    cout << hi << " " << bye << '\n';
}

它几乎可以正常工作(或者至少我认为是)。 我调试看到

但是一旦 operator= returns、hibye 将只有未初始化的值:(

我做错了什么?

一个错误是 operator= return 是值,而它应该 return 是引用。但这不是原因。

原因是缺少 T1T2 的构造函数,这导致它形成对值参数的引用。修复:

template<typename Tr1, typename Tr2>
Tuple(Tr1&& tr1, Tr2&& tr2) 
    : t1(std::forward<Tr1>(tr1))
    , t2(std::forward<Tr2>(tr2))
{}