为什么结构化绑定只适用于auto
Why structured bindings only work with auto
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,i2]=元组;
#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的开头,该lambda按值捕获d2
和i2
,而在其他时候则是一个拆包赋值。所有这些都基于它之后的内容。
把它添加到语言中是不值得的。特别是,正如一些程序员所指出的,你已经有了std::tie
可以用元组做你想做的事情。
不仅如此,std::tie
还允许您忽略一些未打包的值,这是结构化绑定尚不支持的。因此,这一切都归结为拥有一种更有限的语法糖形式,做一些标准库已经对元组做过的事情。
哦,如果你对std::tie
只适用于元组感到不满,你可以自己扩展它来适用于任何POD。看看这个magic_get
实现就知道了。可以将相同的思想应用于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;
}
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- 如何在cmake中包含适用于g++或viceversa的库
- 适用于win32、linux、mac的POSIX C包装器
- 声明适用于 auto,但不能显式声明类型?
- 为什么结构化绑定只适用于auto