On Sunday, 10 October 2021 at 16:12:31 UTC, Carl Sturtivant wrote:
> Why is it that a try block is defined to establish a scope?
try {
auto x = frgl();
}
// ...
// x undefined here
What is the benefit of this? If try (like static if/foreach) did NOT establish a scope, then this annoyance would go away. And if a scope was desired for some reason, then an extra pair of braces could be written within.
Right now rewriting the above requires getting the return type of frgl and declaring x to be of that type before the try block.
Design error?
I do not deny that my heart has greatly desired this.
Proposal:
export try {
auto x = frgl();
}
catch (Exception) {
return false;
}
shall be equivalent to
typeof(frgl()) x = void;
try {
frgl().moveEmplace(x);
}
catch (Exception) {
__EXCEPTION_BODY__
assert(false, "`export` specified: all catch blocks must exit scope");
}
POST
Here, auto frgl
dominates POST
and is thus correct.
Scope guards directly in try{}
should be lifted into the surrounding context, but this is confusing, so they are an error.