基础介绍
c++17版本引入了模板参数类型自动推导功能,在此之前的c++版本使用模版必须显式的指定模板的参数,到了c++17版本可以根据输入的参数自动推导模板参数的类型。注意,模板参数自动推导功能不能自动推导默认构造函数,因为默认构造函数的定义不会显式的输入任何参数,编译器无法推导。
具体实例
文字介绍比较空洞,下面通过例子的形式介绍该版本的特性。
c++17之前模板的使用
std::pair<int, double> p1(1,2.3);
std::vector<int> v1{1,2,3,4};
std::touple<int, std::string, double> t1{1, "hello", 2.3};
c++17引入该特性后的实现
std::pair p1(1,2.3);
std::vector v1{1,2,3,4};
std::touple t1{1,"hello", 2.3};
默认构造函数错误示例
std::vector v; // 错误:无法推导元素类型
std::vector v{}; // 错误:无法推导元素类型
std::vector<int> v; // 正确:显式指定类型
请看上面的例子,错误的例子之所以错误是因为没有显式的指定模板参数,造成编译器无法自动推到,这种情况下只能显示的指定参数类型编译器才能处理。
具体示例
template <typename T, typename U>
class Pair {
T first;
U second;
public:
Pair(T f, U s) : first(f), second(s) {}
};
// C++17 之前
Pair<int, std::string> p1(1, "hello"); // 必须显式指定类型
// C++17 之后
Pair p1(1, "hello"); // 自动推导为 Pair<int, const char*>
上面的例子比较清楚的展示了这个特性。
91

被折叠的 条评论
为什么被折叠?



