Why disallow goto in constexpr functions?
My understanding is there was a desire to get relaxed constexpr
semantics in C++14. A lot of the restrictions that were relaxed were straightforward, but some were more controversial or difficult or [insert adjective of your choice here]. Rather than hold up relaxed constexpr
just for the ability to use goto
, it was decided to just publish the main changes and hold off on the rest. This seems like a pretty sound choice, since constexpr
in C++14 is far more powerful than constexpr
in C++11, and not being able to use goto
is a fairly minor absence, all things considered.
That said, there certainly exists the view that having goto
in constexpr
contexts is both useful and possible. Indeed, the initial proposal for relaxing constexpr
allowed it. So maybe all it takes is somebody that wants it to write a proposal to add it. That somebody could be you! was apparently Ville Voutilainen two years ago in N4472, which featured the quite-relevant-to-this-question paragraph of:
There is unsubstantiated hearsay according to which banning goto in constant expressions is more for taste reasons than technical reasons, meaning that supporting goto in constant expressions isn't particularly hard to implement. I can't say whether that's correct for implementations in general.
The paper had mixed reception, but now that we have constexpr lambdas, maybe it needs to be revisited. And that somebody could be you!