在 C++ 中混合右值和左值的结构化绑定

Structured bindings mixing rvalues and lvalues in C++

以下代码段中的注释行未按预期工作:

double a, b;
auto [c, d] = std::make_tuple<double, double&>([&]() -> double { return a; }(),
                                               [&]() -> double& { return b; }());
static_assert(std::is_same_v<double, decltype(c)>);
// static_assert(std::is_same_v<double&, decltype(d)>);    // Compile error!

具体来说,我想 return 在单个结构化绑定声明中同时包含右值和左值。我尝试使用 auto&auto&& 来声明 cd,但是 none 的方法奏效了。 有没有办法实现上述期望的行为?

std::make_tuple<double, double&>(...) returns std::tuple<double, double>,因为它将 std::decay 应用于模板参数。在任何情况下,你都不应该为它指定模板参数,它可以自动推导它们。

要在元组中有引用,请使用 std::tuple<double, double &>(...) 构造它。然后您的代码将按预期工作。