sky*_*ack 5 c++ templates language-lawyer argument-deduction c++17
最明显的答案可能是 - 因为标准是这样说的.
那很好,但是我正在绕着它去理解这个选择背后的原因.
请考虑以下示例:
template<typename T>
struct S { S(T) {} };
S f() { return 0; }
int main() {
auto s = f();
(void)s;
}
Run Code Online (Sandbox Code Playgroud)
它无法编译错误,如:
错误:使用类模板'S'需要模板参数; 函数返回类型中不允许使用参数推导
很容易修复,这不是问题,像这样的工作正常:
auto f() { return S{0}; }
Run Code Online (Sandbox Code Playgroud)
但是,我想了解在函数返回类型中允许类模板参数推导的缺点是什么.
乍一看,它看起来就像一个愚蠢的限制,但我很确定我在这里缺少一些重要的东西.
Dav*_*aim 10
这里没有语言规则:如果指定了返回类型(而不是auto或模板类型T在哪里T),则该返回类型必须有效.让我给你一个更简单,更好的例子:
std::vector function() {
return std::vector<int>();
}
Run Code Online (Sandbox Code Playgroud)
显然,即使没有花哨的模板也无法编译,auto并且类型扣除,因为std::vector它不是类型,std::vector<int>是.
当S你基本上指定为返回类型时
S它不是类型S<int>.为什么函数返回类型中不允许参数推导?
因为标准是这样说的.
您可以问一个问题:为什么这些代码行之间存在差异:
S s = 0; // OK
S s() { return 0; } // error - even though this is also copy-initializing an "S" from 0
Run Code Online (Sandbox Code Playgroud)
你可以想出一个手写的解释,为什么第一个应该没问题,为什么第二个不应该 - 但基本上,类模板参数推导被提议只解决第一个案例而不是第二个案例.第一个是可以的,因为标准是这样说的,第二个是错误,因为标准是这样说的.
提出了一个扩展(P1021,在"函数的返回类型扣除"下),它将解决第二种情况.你是否认为这是一个好主意...¯\ _(ツ)_ /¯
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |