You are right in so far as the "auto val = get()" was redundant, it should just have been "val = get()". But beyond that to my knowledge the try catch block captures the "val" from the outer scope and works on a reference to it, thus we get the result in the outer scope too. This is confirmed by the TestRunner in which the "notFalse" check succeeds, which it couldnt if val was empty.