类模板的模板参数推导

pair<int, int> pr{1, 42};
auto pr = make_pair(1, 42);  // 利用函数模板
pair pr{1, 42};  // 利用类模板, C++17
int a1[] = {1,2,3};  // 可以自动推出长度 a1[3]
array<int, 3> a2{1,2,3};  // 需要手动指定长度
// array<int> a3{1,2,3};  // 报错
array a{1,2,3};  // 都交由编译器推导出 array<int, 3>,C++17

这种自动推导机制,可以是编译器根据构造函数来自动生成,又或者手工提供一个推导向导

template<typename T>
struct MyObj {
	MyObj(T value);
}

MyObj obj1{string("hello")};
// 得到 MyObj<string>
MyObj obj2{"hello"};
// 得到 MyObj<const char*>

MyObj(const char*) -> MyObj<string>;
MyObj obj{"hello"};
// 隐式转换,得到 MyObj<string>

结构化绑定

multimap<string, int>::iterator lower, upper;
std::tie(lower, upper) = mmp.equal_range("four");  // C++14之前

auto [lower, upper] = mmp.equal_range("four");  // C++17