Function pointer types
Syntax
BareFunctionType →
ForLifetimes? FunctionTypeQualifiers fn
( FunctionParametersMaybeNamedVariadic? ) BareFunctionReturnType?
FunctionTypeQualifiers → unsafe? ( extern Abi? )?
BareFunctionReturnType → -> TypeNoBounds
FunctionParametersMaybeNamedVariadic →
MaybeNamedFunctionParameters | MaybeNamedFunctionParametersVariadic
MaybeNamedFunctionParameters →
MaybeNamedParam ( , MaybeNamedParam )* ,?
MaybeNamedParam →
OuterAttribute* ( ( IDENTIFIER | _ ) : )? Type
MaybeNamedFunctionParametersVariadic →
( MaybeNamedParam , )* MaybeNamedParam , OuterAttribute* ...
Function pointer types, written using the fn
keyword, refer to a function
whose identity is not necessarily known at compile-time.
An example where Binop
is defined as a function pointer type:
#![allow(unused)] fn main() { fn add(x: i32, y: i32) -> i32 { x + y } let mut x = add(5,7); type Binop = fn(i32, i32) -> i32; let bo: Binop = add; x = bo(5,7); }
Function pointers can be created via a coercion from both function items and non-capturing, non-async closures.
The unsafe
qualifier indicates that the type’s value is an unsafe
function, and the extern
qualifier indicates it is an extern function.
For the function to be variadic, its extern
ABI must be one of those listed in items.extern.variadic.conventions.
Attributes on function pointer parameters
Attributes on function pointer parameters follow the same rules and restrictions as regular function parameters.