C ++ 17中的structured binding declaration允许多个不同的选项,例如:
std::tuple<int, int> foo();
auto [a, b] = foo(); // a and b are: int
const auto [a, b] = foo(); // a and b are: int const
const auto& [a, b] = foo(); // a and b are: int const&
有没有办法给a
和b
不同的cv限定符?例如,a
的类型为int
,b
的类型为int const
?
答案 0 :(得分:8)
不 - proposal的Q&amp; A:
涵盖了这一点是否应该扩展语法以允许const /&amp; -qualifying个人姓名的类型?
auto [& x, const y, const& z] = f(); // NOT proposed
我们认为答案应该是否定的。这是一个存储值并将名称绑定到其组件的简单功能, 不要声明多个变量。允许这样的限定将是功能蠕变,将功能扩展到 是不同的东西,即一种声明多个变量的方法。 如果我们确实想要声明多个变量,我们已经有了拼写它的方法:
auto val = f(); // or auto&& T1& x = get<0>(val); T2 const y = get<1>(val); T3 const& z = get<2>(val);
答案 1 :(得分:5)
这是不允许的,但似乎对结构化绑定的工作方式存在一些误解。以下是您的代码段的实际工作方式:
std::tuple<int, int> foo();
auto [a, b] = foo(); // `a` and `b` are `int`
auto& [a, b] = foo(); // error: cannot bind a non-const lvalue-ref to an rvalue.
const auto [a, b] = foo(); // `a` and `b` are: `int const`
const auto& [a, b] = foo(); // `a` and `b` are: `int const`! (NOT `int const&`)
// lifetime extension of `foo()` via `const&`.
根据您提供的示例,似乎错误在于认为auto
中的auto [a, b]
在变量中分配。它不是。 auto
实际上是初始化程序的类型。在C ++中,这大致编码如下:
auto temp = foo(); // `auto` is for the initializer!
// These aren't actually references, but close.
auto&& a = std::get<0>(temp);
auto&& b = std::get<1>(temp);
这与以下内容相反:
auto&& temp = foo(); // save `temp` like range-based `for` does!
// if `auto` in `auto [a, b]` were distributive.
auto a = std::get<0>(temp);
auto b = std::get<1>(temp);