std::make_shared<T>();如果()不填写参数会显示too few args
时间: 2024-12-15 09:26:51 浏览: 14
`std::make_shared<T>()` 是 C++ 标准库中 `<memory>` 模块提供的一个工厂函数,用于创建共享所有权的对象。它简化了动态内存分配的过程,并自动将新创建的对象添加到共享智能指针的管理范围。
当你只使用 `std::make_shared<T>()` 而不传入任何参数时,这表明你需要创建一个 T 类型的默认构造函数实例。如果你的 T 类需要构造函数接受参数,而你没有提供,编译器会报错 "too few arguments",意思是传递的参数不够完成构造函数的要求。
例如:
```cpp
// 如果 T 类有一个带参数的构造函数
class MyClass {
public:
MyClass(int value) : myValue(value) {}
private:
int myValue;
};
// 正确使用 make_shared
std::shared_ptr<MyClass> sharedObject = std::make_shared<MyClass>(42);
// 错误用法,因为 MyClass 需要一个参数
std::shared_ptr<MyClass> incorrectSharedObject = std::make_shared<MyClass>(); // 编译错误
```
相关问题
tatic inline std::shared_ptr<T> MakeShared(Args &&... args) { try { return std::make_shared<T>(std::forward<Args>(args)...); } catch (...) { return nullptr; } } 代码解析
这段代码是一个模板函数的实现,用于创建一个指定类型的`std::shared_ptr`对象。
具体解析如下:
1. `static inline std::shared_ptr<T> MakeShared(Args &&... args)`:函数模板的定义,函数名为`MakeShared`,返回类型为`std::shared_ptr<T>`,参数列表中使用了可变模板参数`Args &&...`,表示可以接受任意数量的参数。
2. `try { ... } catch (...) { ... }`:使用异常处理机制来捕获可能发生的异常。
3. `return std::make_shared<T>(std::forward<Args>(args)...);`:在`try`块中,调用`std::make_shared`函数来创建一个指定类型`T`的`std::shared_ptr`对象。`std::forward<Args>(args)...`用于将参数列表中的参数以完美转发的方式传递给构造函数。
4. `return nullptr;`:在`catch`块中,如果发生异常,则返回`nullptr`,表示创建`std::shared_ptr`失败。
总体来说,这个函数模板可以通过调用`std::make_shared`来创建一个指定类型的`std::shared_ptr`对象,并在创建过程中捕获可能的异常。如果创建成功,则返回创建的对象的指针;如果创建失败,则返回`nullptr`。
std::make_unique和std::make_shared
`std::make_unique`和`std::make_shared`都是C++11引入的内存管理工具,用于创建动态对象并返回其指针。
`std::make_unique`用于创建独占所有权的对象,即该对象的所有权只能被一个`std::unique_ptr`持有。它的语法如下:
```
template< class T, class... Args >
std::unique_ptr<T> make_unique( Args&&... args );
```
其中,`T`是要创建的对象类型,`Args`是传递给对象构造函数的参数列表。`make_unique`函数返回一个`std::unique_ptr<T>`对象,该对象拥有对新创建的`T`对象的所有权。
`std::make_shared`用于创建共享所有权的对象,即该对象可以被多个`std::shared_ptr`共享。它的语法如下:
```
template< class T, class... Args >
std::shared_ptr<T> make_shared( Args&&... args );
```
其中,`T`是要创建的对象类型,`Args`是传递给对象构造函数的参数列表。`make_shared`函数返回一个`std::shared_ptr<T>`对象,该对象拥有对新创建的`T`对象的共享所有权。
值得注意的是,`std::make_shared`相较于直接使用`std::shared_ptr<T>`创建对象,具有更好的性能和更少的内存分配次数。因此,在需要共享对象所有权时,应优先使用`std::make_shared`。
阅读全文