类型扣除c ++标准和auto

时间:2017-06-14 13:21:03

标签: c++ templates type-deduction

如果我理解正确,我们有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会占上风?

1 个答案:

答案 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