《Effective Modern C++》 阅读笔记(一)

2024-09-05

类型推导

template 类型推导

结论

引用类型的推导

示例1:

参数类型是指针或引用的情况时,

template<typename T> 
void f(T& param);

使用:

int x = 27; 
const int cx = x; 
const int& rx = x;
 
f(x); //T is int, param's type is int& 
f(cx); // T is const int, param's type is const int& 
f(rx); // T is const int, param's type is const int&

示例中的& 替换为指针* 是一样的效果。 原则:

注: 可以关注const在类型推导时的传递性

示例2:

universal reference的情况:

template <typename T> 
void f(T&& param); 
 
int x = 27; 
const int cx = x; 
const int& rx = x;
 
f(x); //x is lvalue, so T is int&, param's type is alse int& 
f(cx); //cx is lvalue, so T is const int& param's type is also const int& 
f(rx); // rx is lvalue, so T is const int&, param's type is also const int& 
f(27); // 27 is rvalue, so T is int,  param's type is therefore int&&

甚于情况 参数类型既不是引用也不是指针,那就是值传递

auto 类型推导

结论

以下示例,区分auto 和template对于类型推导的初始化列表的应用情况

auto x = {11,23,9}; //x's type is std::initializer_list<int> 
 
template<typename T> 
void f(T param); // template with parameter declaration  equivalent to x's declaration 
 
f({11,23,9}); // error! can't deduce type for T

decltype

结论

一个示例展示decltype用处:

template<typename Container, typename Index> 
decltype(auto) authAndAccess(Container&& c, Index i) { 
	authenticateUser(); 
	return std::forward<Container>(c)[i]; 
}

c++14中可以使用auto 返回值,但是c++11中不行,所以需要如此实现:

template<typename Container, typename Index> 
auto authAndAccess(Container&& c, Index i) 
->decltype(std::forward<Container>(c)[i]) 
{ 
	authenticateUser(); 
	return std::forward<Container>(c)[i]; 
}

其中,

auto funcname(param1, param2) -> returntype

这种格式的函数声明也是从c++11开始支持,即追踪返回值类型的写法。 按理,更加符合人的直观理解,函数名->参数->返回值

怎么查看推导的类型

结论