为什么结构化绑定只能与自动运行
问题描述:
Structured bindings已经与C++ 17一起引入。它们可以声明从元组或结构初始化的多个变量。为什么结构化绑定只能与自动运行
该代码使用c++17
编译器进行编译。
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 1);
auto [ d, i ] = tuple;
std::cout << "d=" << d << " i=" << i << '\n';
return 0;
}
如果我不auto
声明变量出现错误
错误:lambda表达式的预期身体 [D2,12] =元组;
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 2);
double d2;
int i2;
[d2 , i2] = tuple;
return 0;
}
我用clang version 4.0.0
和编译选项-std=c++1z
。
我可以将现有变量分配给结构化绑定吗?我需要使用auto
吗?
答
你得到的错误信息很好地表明了为什么它只允许与auto
:缺乏歧义,这将使语法甚至更多上下文相关。
表达式开始的一对方括号表示一个lambda。你所要求的是标准来指定有时[d2 , i2]
是一个lambda的开始,它按值捕获d2
和i2
,在其他时间这是一个拆包分配。全部基于它后面的内容。
将它添加到语言中是不值得的复杂性。特别是,由于as Some programmer dude noted,你已经有std::tie
做你想要的元组。
不仅如此,std::tie
允许您忽略一些解压值,某些结构化绑定目前还不支持。所有这些都归结为一个更有限的语法糖,来完成标准库已经对元组进行的操作。
哦,如果你是disgruntles是std::tie
仅适用于元组,可以展开它与任何POD自己的工作。看看这个magic_get
implementation。可以将相同的想法应用于constexpr
将POD转换为可以馈送至std::tie
的参考元组。事情是这样的:
std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);
答
此外,您还可以使用std::tie()
来把它解析成单独的成分。如
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 1);
double d2;
int i2;
std::tie(d2, i2) = tuple;
std::cout << "d2=" << d2 << " i2=" << i2 << '\n';
return 0;
}
结构化绑定只有在定义和初始化变量时才可能。这是不可能的作为一般的任务(用于['std :: tie'](http://en.cppreference.com/w/cpp/utility/tuple/tie))。 –