What is `const fn`?


#1

I have found const fn function somewhere on stackoverflow recently but I don’t remember seeing it in the rust-book or anywhere else. What is it, what are use cases?


#2

It is a function which can be evaluated at compile time, conceptually similar to constexpr functions in C++. That is currently a nightly-only feature, although work has begun on stabilizing calls to const fns. The name comes from the fact that you can assign the result of a const fn to a const.

There are two broad use cases. One is to make sure that the compiler can pre-compute some quantities at compilation time when that is necessary for good run-time performance. The other is to derive quantities which have to be known at compile time, such as the length of arrays.


#3

Any time you see an unstable feature, you can go to https://doc.rust-lang.org/nightly/unstable-book/ and find out at least something about it.

In this case, that’s this page: https://doc.rust-lang.org/nightly/unstable-book/language-features/const-fn.html

It also points to the tracking issue: https://github.com/rust-lang/rust/issues/24111

which points to the RFC: https://github.com/rust-lang/rfcs/pull/911

It’s true that these aren’t the best possible docs, but since we’re still working on stable things, we don’t always take a ton of time to document unstable features.


#4

So is const fn essentially marking a function as “pure”?

I got this idea from another comment … and I’d be really happy to see support for pure functions. I.e., functions with referential transparency, where it always returns the same output for a given input. The RFC and Issues seem to imply this, but I’m not sure.


#5

Yes.


#6

I think i had a problem with this too:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5503395aacf1c7ab5c87a79da61b659a

trying to assign the return values of a normal (non const) function to a constant results in compiler error :frowning:

And generic const. functions are not supported (because type size has to be predefined??).


#7

Actually it’s because count_searchvalue isn’t const, and even if you try, you will end up with generic problems because generic const fns aren’t stable:

error: trait bounds other than `Sized` on const fn parameters are unstable
  --> src/lib.rs:20:28
   |
20 | const fn count_searchvalue<T: std::cmp::PartialEq>(tofind: &T, gamemap: &[T])->usize{
   |                            ^

and this is furthered by the fact that there is a call to a non-const function iter in count_searchvalue. Even if you take away the call to count_searchvalue and replace it with a constant, you end up with a plethora of problems in your other function that isn’t really structured in a way to support consting it.