Why doesn't the standard allow the compiler to analyse the compound-statement and determine the return type based on the first found return statement?
По моему мнению, причинами являются наследование , неявное приведение типов к void*
и 0
приведение типов к int
, что затрудняет для разработчиков компилятора вывод типа первое return
утверждение.
Смотрите ниже примеры:
// "B" is a derived by "D"
int main(){
auto l = []{
return (D*)(...); // should it be "D*" (derived)
// computation
return (B*)(...); // no it should be "B*" (base)
}
}
Во-вторых,
int main(){
auto l = []{
return (int*)(...); // should it be "int*"
// computation
return (void*)(...); // no it has to be "void*"
}
}
Третий,
int main(){
auto l = []{
return 0; // should it be "int"
// computation
return (double)(...); // no it has to be "double"
}
}
Также существует еще одна причина, связанная с выдачей сообщения об ошибке компиляции , когда обнаружены два несвязанных return
:
int main(){
auto l = []{
return TYPE1;
// computation
return TYPE2;
}
}
Теперь возникнет вопрос, какое полезное сообщение компилятора должно быть напечатано пользователю? Сообщение об ошибке должно быть только для одного из операторов return
. Какой return
выбрать?