如果我理解正确,我们有3个类型扣除案例:
1)param不是引用也不是指针。
int x = 5;
template< typename T>
func( T param )
template< typename T>
func1( T & param )
func(x)
func1(x)
在两种情况下,T推断为int
2)param是指针或引用,在这种情况下我们忽略reference和pointer -ness
template< typename T>
func( T & param )
int x = 5;
const int y =x;
const int &z =x;
func(x) // param is type int & and T is type int
func(y) // param is type const int & and T is type const int
func(z) // param is type const int & and T is type const int
3)param是&#34;通用参考&#34;。
template< typename T>
func( T && param )
int x = 5;
const int y = x;
const int & z = x;
func(x) // param is type int & and T is type int &
func(y) // param is type const int & T is type const int &
func(z) // param is type const int & and T is type const int &
func(5) // param is type int && and T is type int &&
auto
关键字除
auto x = {1 , 2 , 3}
auto x
的类型为initalizer_list
然而,这如何与constness一起使用?
struct Test{ int x };
Test t;
const Test & t1 = t;
auto t2 = t1; // t2 is type of Test not const Test &
例如,如果我们通过了
const int * const x = ...
在什么情况下,consts会被忽略,什么是consntess会占上风?
答案 0 :(得分:0)
auto
使用与template argument deduction
相同的规则:
来自cppreference:
一旦确定了初始化程序的类型,编译器就会使用函数调用中的模板参数推导规则来确定将替换关键字
auto
的类型
所以,按照你的例子:
struct Test{ int x };
Test t;
const Test & t1 = t;
auto t2 = t1; // t2 is Test
const auto t3 = t1; // t3 is const Test