gpt4 book ai didi

c++ - std::make_tuple 不做引用

转载 作者:IT老高 更新时间:2023-10-28 12:34:06 35 4
gpt4 key购买 nike

我一直在尝试 std::tuple结合引用文献:

#include <iostream>
#include <tuple>

int main() {
int a,b;
std::tuple<int&,int&> test(a,b);
std::get<0>(test) = 1;
std::get<1>(test) = 2;
std::cout << a << ":" << b << std::endl;

// doesn't make ref, not expected
auto test2 = std::make_tuple(a,b);
std::get<0>(test2) = -1;
std::get<1>(test2) = -2;
std::cout << a << ":" << b << std::endl;

int &ar=a;
int &br=b;
// why does this not make a tuple of int& references? can we force it to notice?
auto test3 = std::make_tuple(ar,br);
std::get<0>(test3) = -1;
std::get<1>(test3) = -2;
std::cout << a << ":" << b << std::endl;
}

在此处的三个示例中,前两个按预期工作。然而,第三个没有。我期待 auto类型 ( test3 ) 与 test 的类型相同(即 std::tuple<int&,int&> )。

看来std::make_tuple不能自动生成引用元组。为什么不?除了自己明确地构建这种类型的东西之外,我还能做些什么来做到这一点?

(编译器为 g++ 4.4.5,using 4.5 doesn't change it)

最佳答案

std::tie 进行非const 引用。

auto ref_tuple = std::tie(a,b); // decltype(ref_tuple) == std::tuple<int&, int&>

对于 const 引用,您需要 std::cref 包装函数:

auto cref_tuple = std::make_tuple(std::cref(a), std::cref(b));

或者在将变量传递给 std::tie:

之前使用简单的 as_const 助手来限定变量
template<class T>
T const& as_const(T& v){ return v; }

auto cref_tuple = std::tie(as_const(a), as_const(b));

或者,如果你想变得花哨,写你自己的ctie(重用std::tieas_const):

template<class... Ts>
std::tuple<Ts const&...> ctie(Ts&... vs){
return std::tie(as_const(vs)...);
}

auto cref_tuple = ctie(a, b);

关于c++ - std::make_tuple 不做引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7867220/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com