返回介绍

8.1 构造函数模板参数推导

发布于 2024-08-19 12:44:37 字数 2325 浏览 0 评论 0 收藏 0

几十年来,人们好奇为什么模板参数可以从其他函数参数中推导出来,却不能从构造函数参数中推导。例如,在 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() 了。

这简化了类型的使用,例如 pairtuple,还有当编写并行的代码时用到的锁和互斥锁(§8.4)。

shared_lock lck {m};    // 不需要显式写出锁类型

这是一个在 C++17 中少见的例子,相互支持的特性促成了明显的代码简化。不幸的是,这些简化被接受与否都是个案,而非总体的简化努力的结果。所以,在类型推导规则中填坑的努力仍在继续 [Spertus et al. 2018]。

除了这里的描述之外,这套机制提供了解决歧义的一种写法(§8.3)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文