>From TDPL, page 263: "Nested struct objects cannot be returned from functions because the caller doesn't have access to their type".
However auto seems to work around this limitation: module structInFunction; import std.stdio; void main() { auto local = foo(0); assert(local.sum() == 30); writeln(typeid(local)); // structInFunction.foo.Local } auto foo(int a) { int z = a + 10; struct Local { int x; int y; int sum() { return x + y + z; } } return Local(10, 10); } I don't have a use case for this, personally. But it does seem to work. Well, almost. The following issues a runtime error: module structInFunction; import std.stdio; void main() { auto local = foo(0); writeln(local.sum()); assert(local.sum() == 30); writeln(typeid(local)); // structInFunction.foo.Local } auto foo(int a) { int z = a + 10; struct Local { int x = 10; int y = 10; int sum() { return x + y + z; } } Local local; return local; } object.Error: Access Violation An explicit call to the ctor like this works with no runtime errors: auto local = Local(); return local;