是否可以在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”)。
答案 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&