auto return for some recursive functions in C++11
Xinok via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jan 14 16:05:30 PST 2015
On Wednesday, 14 January 2015 at 22:37:22 UTC, ketmar via
Digitalmars-d wrote:
> On Wed, 14 Jan 2015 22:29:08 +0000
> bearophile via Digitalmars-d <digitalmars-d at puremagic.com>
> wrote:
>
>> According to Wikipedia:
>> http://en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction
>>
>> C++14 is able to compile code like this:
>>
>>
>> auto correct(int i) {
>> if (i == 1)
>> return i;
>> else
>> return correct(i - 1) + i;
>> }
>>
>>
>> But not like this:
>>
>> auto correct(int i) {
>> if (i != 1)
>> return correct(i - 1) + i;
>> else
>> return i;
>> }
>>
>>
>> D isn't able to compile both. Is it a good idea to allow the
>> first function in D too?
>>
>> Bye,
>> bearophile
> i'm pretty sure that D *SHOULD* compile the first sample. the
> spec says
> that return type for `auto` function is taken from the first
> `return`
> operator parser met. so for the second `return` the return type
> is
> already known.
>
> i think that this is not just "let it compile", but a bug in
> compiler.
> something should be fixed: either compiler or specs.
Well, the error the compiler prints is:
Error: forward reference to inferred return type of function call
'correct'
I played with it a bit and it seems to deduce a common type from
all the return statements, which would be more in the style of D
anyways (take type deduction for arrays). For example, the
following code prints "float" rather than "int":
import std.stdio;
auto one(int i)
{
if(i > 0)
return cast(int)i;
else
return cast(float)i;
}
void main()
{
writeln(typeid(typeof(one(10))));
}
More information about the Digitalmars-d
mailing list