Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I wonder why && and || are not allowed in const functions?

> All boolean operators except for && and || which are banned since they are short-circuiting.

I guess I'm missing something obvious but why does the short circuiting break const-ness?



That was a restriction from before 1.46 stabilized control flow in const functions. Now that we have worked out the details around `if`, we can also stabilize `&&` and `||`.

(I'm a little surprised they weren't stabilized at the same time! Edit: they were! I just didn't look closely enough.)


> (I'm a little surprised they weren't stabilized at the same time!)

They were stabilized at the same time, see the release announcement.

https://blog.rust-lang.org/2020/08/27/Rust-1.46.0.html


Short circuiting introduces conditional branching. If you call a function on the right hand side of a || or && it might or might not be executed depending on the value of the left hand side.

Until this version of rust, all conditional branches were banned from const functions.

I guess to keep things simple they just banned any feature that might cause branching.


Why is branching a problem? Since `if` is now enabled in a const fn, it's trivial to rewrite && with & and if.


`if` wasn't enabled before, so `&&` wasn't enabled. Now that `if` is enabled, `&&` now works too.


Ahh that makes a lot of sense, if you're going to have a compiler insert the result of a function having conditional branching seems a bit gnarly I guess?


For the history of this feature request, see https://github.com/rust-lang/rust/issues/29608 as a starting point.


It's conditional based on what's ultimately constant data, so you end up with predictable output regardless.


That's a weird restriction on not allowing logical operators. AFAIK C++ allows this for constexpr functions - as long as it can be evaluated at compile time.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: