On Thursday, 1 June 2017 at 12:04:05 UTC, Daniel Tan Fook Hao wrote:
Somehow this code works for me:

```D
auto error (int status, string description){
    struct Error {
        int status;
        string description;
    }
    Error err = {
        status,
        description
    };
    return err.serializeToJson;
}
```

which is supposed to be the same as

```D
struct Error {
    int status;
    string description;
}
auto error (int status, string description){
    Error err = {
        status,
        description
    };
    return err.serializeToJson;
}
```

It's not really the same, the structs will have a different type: in the first case, it'd be modulename.error.Error, while in the second case it's just modulename.Error. Furthermore, if Error declared inside the function had methods, it'd become a `nested` struct, which carries a context pointer.

If I'm reading this right, in the former, the struct is created when the function is called in run-time, and the type is then inferred after that? I don't really understand the behavior behind this.

No, nothing happens at run time, the type is known statically, it is inferred from the `return` statement in that function: https://dlang.org/spec/function.html#auto-functions. If you omit the type or specify 'auto', the compiler will look at your `return`s (if any) and try to infer the type from them. If they clash (i.e. you're trying to return different types from the same function), it's a compile-time error. Otherwise, it's whatever type is being returned.

Reply via email to