为什么gcc解析第一个return子句后不能推导出返回值类型?
为什么此代码无效?
auto f() {
if (true) return 0;
return {};
}
解析后0,我认为gcc应该知道函数的返回类型f是int,但它仍然解释{}为initializer_list解析最终返回子句时,为什么?
回答
从函数#Return_type_deduction
如果有多个 return 语句,它们必须都推导出相同的类型
和
如果 return 语句使用了大括号初始化列表,则不允许推导:
其中禁止这种构造。
一旦在函数中看到 return 语句,从该语句推导出的返回类型就可以用于函数的其余部分,包括其他 return 语句。
只允许递归地重用该函数。
-
@super: It is to allow recursive calls mainly `auto fact(int n) { if (n < 2) return 1;
return n * fact(n - 1);
}` is valid. (whereas `auto fact(int n) {
if (n >= 2) return n * fact(n - 1);
return 1;}` isn't). Once we encounter first return, we might assumes the return type, but others rules still apply: consistent return type and no `return {..}`.