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