我正在尝试构建自己的智能指针,这将使我能够这样声明:
SmartPtr<MyClass> ptr = new MyClass;
我希望构造函数明确,所以我这样做了:
template<class T>
class SmartPtr
{
public:
SmartPtr();
explicit SmartPtr(T* _ptr);
explicit SmartPtr(const SmartPtr& other);
}
但是,当我尝试按照我在上面提到的声明时,我会收到以下错误:
error: conversion from ‘MyClass*’ to non-scalar type ‘SmartPtr<MyClass>’ requested
我知道错误是因为复制CTOR具有" ="的特殊语法,并且在该方法中不能声明转换CTOR。我的问题是,是否有任何方法可以保留我上面提到的所需语法,并且具有明确的ctor?
我的问题是,是否有任何方法可以保留我上面提到的所需语法,并且具有明确的ctor?
可能不是。该语法是复制初始化,需要一个非阐明构造函数。
请注意,复制构造函数不需要明确。如果它是明确的,那么您将无法将SmartPtr
传递给按值接受它的函数。
用最小语法开销构建指针的另一种方法是添加出厂功能,并使用它:
template<class T>
SmartPtr<T> make_ptr(T* p) {
return SmartPtr<T>{p};
}
auto ptr = make_ptr(new MyClass);
或类似std::make_shared<>
的东西:
auto ptr = make_ptr<MyClass>();