在 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&&
来声明 c
和 d
,但是 none 的方法奏效了。 有没有办法实现上述期望的行为?
std::make_tuple<double, double&>(...)
returns std::tuple<double, double>
,因为它将 std::decay
应用于模板参数。在任何情况下,你都不应该为它指定模板参数,它可以自动推导它们。
要在元组中有引用,请使用 std::tuple<double, double &>(...)
构造它。然后您的代码将按预期工作。
以下代码段中的注释行未按预期工作:
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&&
来声明 c
和 d
,但是 none 的方法奏效了。 有没有办法实现上述期望的行为?
std::make_tuple<double, double&>(...)
returns std::tuple<double, double>
,因为它将 std::decay
应用于模板参数。在任何情况下,你都不应该为它指定模板参数,它可以自动推导它们。
要在元组中有引用,请使用 std::tuple<double, double &>(...)
构造它。然后您的代码将按预期工作。