在std :: tuple中返回引用和值

时间:2020-05-18 11:04:27

标签: c++ c++17

是否可以在std :: tuple内部以某种方式返回引用和值。

考虑这样的事情:

#include <tuple>
#include <assert.h>

struct A
{
    A() = default;
    A(const A&) = delete;
    A& operator=(const A&) = delete;
    int test = 99;
};

A a;

A& get_A() {return a;}

auto return_tuple_with_reference_and_value()
{
    return std::forward_as_tuple(get_A(), 20);
}

int main()
{
    auto[reference_to_a, value] = return_tuple_with_reference_and_value();
    assert(reference_to_a.test == 99);
    assert(value == 20);
    reference_to_a.test = 1111;
    assert(a.test == 1111);
}

我们可以使其工作吗?现在它有UB(悬挂引用为“ 20”)。

2 个答案:

答案 0 :(得分:1)

我找不到能做到这一点的标准函数,但是编写一个函数并不难:

template <typename ...P>
auto foo(P &&... params)
{
    return std::tuple<P...>(std::forward<P>(params)...);
}

答案 1 :(得分:1)

您可以使用std::make_tuple并传递reference_wrapper

对于Ti中的每个Types...Vi中的相应类型VTypes...std::decay<Ti>::type,除非应用std::decay导致{{1 }}用于某些类型std::reference_wrapper<X>,在这种情况下,推导类型为X

X&