You call it with: Your function prototype is: template<typename T>
void func(T val)
template<typename T>
void func(T& val)
template<typename T>
void func(const T& val)
template<typename T>
void func(T&& val)
(Tested with GCC 7.2 using -std=c++17)
int x;
func(x);
T isintintintint&
decltype(val) isintint&const int&int&
decltype((val)) isint&int&const int&int&
const int y;
func(y);
T isintconst intintconst int&
decltype(val) isintconst int&const int&const int&
decltype((val)) isint&const int&const int&const int&
func(5); T isint intint
decltype(val) isintconst int&int&&
decltype((val)) isint&const int&int&
func(std::move(x)); T isint intint
decltype(val) isintconst int&int&&
decltype((val)) isint&const int&int&
int&& z = std::move(x);
func(z);
T isintintintint&
decltype(val) isintint&const int&int&
decltype((val)) isint&int&const int&int&
int x;
func<int>(x);
T isintintint
decltype(val) isintint&const int&
decltype((val)) isint&int&const int&
const int y;
func<int>(y);
T isint int
decltype(val) isintconst int&
decltype((val)) isint&const int&
func<int>(5); T isint intint
decltype(val) isintconst int&int&&
decltype((val)) isint&const int&int&
int x;
func<int&>(x);
T isint&int&int&int&
decltype(val) isint&int&int&int&
decltype((val)) isint&int&int&int&
const int y;
func<int&>(y);
T is
decltype(val) is
decltype((val)) is
func<int&>(5); T is
decltype(val) is
decltype((val)) is
int x;
func<int&&>(x);
T is int&&int&&
decltype(val) isint&int&
decltype((val)) isint&int&
const int y;
func<int&&>(y);
T is
decltype(val) is
decltype((val)) is
func<int&&>(5); T isint&& int&&
decltype(val) isint&&int&&
decltype((val)) isint&int&
int x;
func<const int>(x);
T isconst intconst intconst int
decltype(val) isconst intconst int&const int&
decltype((val)) isconst int&const int&const int&
const int y;
func<const int>(y);
T isconst intconst intconst int
decltype(val) isconst intconst int&const int&
decltype((val)) isconst int&const int&const int&
func<const int>(5); T isconst intconst intconst intconst int
decltype(val) isconst intconst int&const int&const int&&
decltype((val)) isconst int&const int&const int&const int&
int x;
func<const int&>(x);
T isconst int&const int&const int&const int&
decltype(val) isconst int&const int&const int&const int&
decltype((val)) isconst int&const int&const int&const int&
const int y;
func<const int&>(y);
T isconst int&const int&const int&const int&
decltype(val) isconst int&const int&const int&const int&
decltype((val)) isconst int&const int&const int&const int&
func<const int&>(5); T isconst int&const int&const int&const int&
decltype(val) isconst int&const int&const int&const int&
decltype((val)) isconst int&const int&const int&const int&
int x;
func<const int&&>(x);
T is const int&&const int&&
decltype(val) isconst int&const int&
decltype((val)) isconst int&const int&
const int y;
func<const int&&>(y);
T is const int&&const int&&
decltype(val) isconst int&const int&
decltype((val)) isconst int&const int&
func<const int&&>(5); T isconst int&&const int&& const int&&
decltype(val) isconst int&&const int&const int&&
decltype((val)) isconst int&const int&const int&