为什么c++ 17的结构化绑定不使用{}?
Why do C++17 structured bindings not use { }?
我在这里找到了* c++结构化绑定的原始建议。它提出了一种轻松绑定多个返回值的方法,即:
auto {a, b} = minmax(data);
但是现在我看到每个人都指向c++ 17/c++ 1z的建议语法
auto [a, b] = minmax(data);
现在我学了"列表是写{like, this}",有一个新的列表语法?为什么?这里的花括号有什么问题?
来自西班牙和美国的国家机构已经提议改回{}
语法,因为(P0488R0):
最初使用的"结构化绑定"建议大括号"{}"分隔绑定标识符。那些分隔符更改为中括号"[]"断言它们没有引入任何语法问题。然而,他们竟然介绍属性和lambda的语法歧义。在光的各种建议的修复,它似乎原语法更合适。
因此,仍然有可能最终使用c++ 17的原始语法(我强烈认为大多数用户更喜欢这种语法)。
从这次旅行报告中更新:
分解声明的原始建议使用语法
auto {a, b, c};
,在上次会议上更改为auto [a, b, c]
。这个变化是相当有争议的,一些评论要求将其更改回{}
(而其他人则鼓励保留[]
)。双方都有技术上的争论(一旦你开始允许嵌套分解,[]
语法可能会与属性冲突;如果您将概念放入其中并允许使用概念名称而不是auto
,那么{}
语法可能与统一初始化相冲突,因此最终这主要取决于您的品味。clang实现者确实报告说他们两者都尝试过,并且发现使用[]
更容易解决歧义。最后,没有达成一致意见,因此保持现状([]
语法)。
这仍在争论中。考虑到[]和{}已经被使用了很多次,很难确定哪种语法最容易混淆。
还存在"最容易混淆"answers"最容易解析"发生冲突的风险。
@SebastianWahl只评论了一个链接。我将快速总结链接背后的内容。
Chandler Carruth对这个问题的回答:youtube .be/430o2HMODj4?t = 15 m50
auto [a,b,c] = f();
是ok的auto
。但是你也可以这样做:
tuple<int,float,string> [a,b,c] = f();
所以当你使用{...}
时,这将变成
tuple<int,float,string> {a,b,c} = f(); //<<< not C++17
是坏的,因为tuple<int,float,string> {a,b,c}
在c++中也有意义,因此会是一个难以解决的歧义,
从{}到[]的变化发生在Jacksonville会议之后,是对会议评论的回应。这在p0144r2中有详细说明,其中指出:"因为它在视觉上与声明相同类型的多个变量的现有语法更不同。"
似乎要求更改{}的原始用法的NB评论在2016年11月的会议上没有增加共识,使[]的用法保持不变。至少在春季会议之前。
关于方括号语法需要说明的一点是,它非常类似于lambda捕获子句,在其中,您不需要指定变量类型,因为auto是隐含的。例如
auto func = [a, b] {}
auto func = [a=1, b=2.0] {}
这显然不是完全一样的东西,但是当你把它看作是"通过理解上下文来自动捕获的语法"时,它可以工作:
auto [a, b] = std::make_pair(1, 2.0);
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- 有没有办法将重载的类函数绑定到函数对象?
- 替换 C++17 中移除的绑定 1st