文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.1 构造函数模板参数推导
几十年来,人们好奇为什么模板参数可以从其他函数参数中推导出来,却不能从构造函数参数中推导。例如,在 C++98、C++11 和 C++14 中:
pair<string,int> p0 (string("Hi!"),129); // 不需要推导
auto p1 = make_pair("Hi!"s,129); // p1 是 pair<string,int>
pair p2 ("Hi!"s,129); // 错误:pair 缺少模板参数
很自然,在我第一次设计模板的时候,我也考虑过从构造函数参数中推导出模板参数的可能性,但因为担心出现歧义而止步。解 决方案也有技术障碍,但 Michael Spertus 和 Richard Smith 克服了这些障碍。所以在 C++17 中,我们可以写上面最后一个例子中那样的代码(p2
)而不会报错,这样一来就不需要 make_pair()
了。
这简化了类型的使用,例如 pair
和 tuple
,还有当编写并行的代码时用到的锁和互斥锁(§8.4)。
shared_lock lck {m}; // 不需要显式写出锁类型
这是一个在 C++17 中少见的例子,相互支持的特性促成了明显的代码简化。不幸的是,这些简化被接受与否都是个案,而非总体的简化努力的结果。所以,在类型推导规则中填坑
的努力仍在继续 [Spertus et al. 2018]。
除了这里的描述之外,这套机制提供了解决歧义的一种写法(§8.3)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论