【发布时间】:2018-05-31 10:36:05
【问题描述】:
最明显的答案可能是 - 因为标准是这样说的。
没关系,但我正在仔细研究它以了解此选择背后的原因。
考虑以下示例:
template<typename T>
struct S { S(T) {} };
S f() { return 0; }
int main() {
auto s = f();
(void)s;
}
编译失败,出现如下错误:
错误:使用类模板“S”需要模板参数;函数返回类型中不允许参数推导
很容易修复,这不是问题,这样的事情就可以了:
auto f() { return S{0}; }
但是,我想了解在函数返回类型中也允许类模板参数推导的缺点是什么。
乍一看,这似乎是一个愚蠢的限制,但我很确定我在这里遗漏了一些重要的东西。
【问题讨论】:
-
我觉得不规范,因为这种代码写起来容易,但读起来很难看懂(实际用的是什么类型)。标准编写器主要包括基于最佳实践的功能,而您的示例似乎使编写代码更加困难。
-
但您现在几乎可以做到这一点 - 使用 lambdas。
-
@BhavinChirag 我同意。几乎。毕竟使用
auto作为返回类型并不是更明确。
标签: c++ templates language-lawyer c++17 template-argument-deduction