Yes, cont fn can be used in impl struct, but not in traits.
This works fine:
#![feature(const_fn)]
#![feature(associated_consts)]
struct TestStruct{}
impl TestStruct {
const fn get_some_number(&self) -> i32 {
42
}
}
fn main() {
let test = TestStruct{};
println!("{}", test.get_some_number());
}
Playground
This does not:
#![feature(const_fn)]
#![feature(associated_consts)]
struct TestStruct1{}
trait TestTrait {
const fn get_some_number(&self) -> i32;
}
impl TestTrait for TestStruct1 {
const fn get_some_number(&self) -> i32 {
42
}
}
struct TestStruct2{}
impl TestTrait for TestStruct2 {
const fn get_some_number(&self) -> i32 {
43
}
}
fn main() {
let test1 = TestStruct1{};
let test2 = TestStruct2{};
println!("{} {}", test1.get_some_number(), test2.get_some_number());
}
Playground
error[E0379]: trait fns cannot be declared const
EDIT:
Constants are more consistent:
This works:
#![feature(const_fn)]
#![feature(associated_consts)]
struct TestStruct{}
impl TestStruct {
const SOME_NUMBER: i32 = 42;
}
fn main() {
println!("{}", TestStruct::SOME_NUMBER);
}
Playground
And so does this:
#![feature(const_fn)]
#![feature(associated_consts)]
struct TestStruct1{}
trait TestTrait {
const SOME_NUMBER: i32;
}
impl TestTrait for TestStruct1 {
const SOME_NUMBER: i32 = 42;
}
struct TestStruct2{}
impl TestTrait for TestStruct2 {
const SOME_NUMBER: i32 = 43;
}
fn main() {
println!("{} {}", TestStruct1::SOME_NUMBER, TestStruct2::SOME_NUMBER);
}
Playground