digitalmars.D.learn - Returning reference: why this works?
- Denis Feklushkin (17/17) Mar 13 2019 import std.stdio;
- Johan Engelen (5/15) Mar 13 2019 Indeed, you're invoking UB here. With compiler flag `-dip25` that
- Denis Feklushkin (2/20) Mar 13 2019 Oh, very unexpected! Thank you very much!
import std.stdio; struct S { int x; } ref S func1(ref S i) // i is reference { return i; } ref S func2(S i) // i is not reference { return func1(i); // Works! Possibility to return reference to local object i? //return i; // Error: returning i escapes a reference to parameter i } void main() { auto ret = func2(S(2)); writeln(ret); // "S(2)" }
Mar 13 2019
On Wednesday, 13 March 2019 at 20:57:13 UTC, Denis Feklushkin wrote:import std.stdio; struct S { int x; } ref S func1(ref S i) // i is reference { return i; } ref S func2(S i) // i is not reference { return func1(i); // Works! Possibility to return reference to local object i?Indeed, you're invoking UB here. With compiler flag `-dip25` that code no longer compiles. -Johan
Mar 13 2019
On Wednesday, 13 March 2019 at 21:04:01 UTC, Johan Engelen wrote:On Wednesday, 13 March 2019 at 20:57:13 UTC, Denis Feklushkin wrote:Oh, very unexpected! Thank you very much!import std.stdio; struct S { int x; } ref S func1(ref S i) // i is reference { return i; } ref S func2(S i) // i is not reference { return func1(i); // Works! Possibility to return reference to local object i?Indeed, you're invoking UB here. With compiler flag `-dip25` that code no longer compiles. -Johan
Mar 13 2019