A.9 模板类参数的推导

C++ 17扩展了模板参数自动推断类型的思想:如果声明模板化的对象,在很多情况下,模板参数的类型可以从对象初始化器中推导出来。

具体来说,如果使用类模板来声明对象,而不指定模板参数列表,则根据函数模板的常规类型推导规则,使用类模板中指定的构造函数从对象的初始值设定项中推导模板参数。

例如,互斥量模板类型以std::lock_guard作为一个模板参数。构造函数还接受单个参数,该参数是对该类型的引用。如果将对象声明为std::lock_guard类型,则可以从提供的互斥体类型推断类型参数:

std::mutex m;
std::lock_guard guard(m); // 推断出std::lock_guard<std::mutex>

同样适用于std::scoped_lock,虽然它有多个模板参数,但也能从多个互斥参数推导得出:

std::mutex m1;
std::shared_mutex m2;
std::scoped_lock guard(m1,m2);
// 推断出std::scoped_lock<std::mutex,std::shared_mutex>

对于那些可能推导错误类型的模板,模板作者可以编写显式的推导指南,以确保导出正确的类型。这些都超出了本书的范畴。