C++ Primer(第5版) 练习 16.38
练习 16.38 当我们调用make_shared(参见12.11节,第401页)时,必须提供一个显示模板实参。解释为什么需要显示模板实参以及它是如何使用的。
环境:Linux Ubuntu(云服务器)
工具:vim
解释
在 C++ 中使用 std::make_shared 时,如果要指定要为其创建 std::shared_ptr 的对象类型,通常需要显式模板参数。
1. 类型推导限制:
- 推导失败:调用 make_shared 时,如果构造函数参数没有为编译器提供足够的信息来推导类型,则必须显式指定类型。
- 歧义:如果一个类有多个构造函数,编译器可能无法确定要使用哪个构造函数,从而导致歧义。提供显式模板参数可以通过指定确切的类型来解决此问题。
2. 模板实例化:
- 多态类型:如果您为多态类型(即具有虚函数的类)创建 shared_ptr,并且传递基类指针或引用,则编译器将无法推断出派生类类型。
- 自定义分配器:在涉及自定义分配器的场景中,可能无法正确推断分配器类型。
3. 零参数构造函数:
- 如果您使用零参数构造函数创建对象,则编译器没有参数来推断类型,因此需要明确指定。
4. 非默认构造函数:
- 当使用具有非默认参数的构造函数时,如果参数的类型不完全匹配,则类型推断可能会失败,因此需要明确指定。