C++ C++;使用唯一指针为向量类订阅运算符[]

C++ C++;使用唯一指针为向量类订阅运算符[],c++,vector,malloc,smart-pointers,unique-ptr,C++,Vector,Malloc,Smart Pointers,Unique Ptr,我正在使用malloc编写自己的向量类。特别是,为了提供一个极小的示例,我只展示了构造函数和订阅操作符[] #include <iostream> #include <algorithm> #include <utility> #include <cstdlib> template<typename T> class Vector{ std::unique_ptr<T,decltype(&free)> elem

我正在使用
malloc
编写自己的向量类。特别是,为了提供一个极小的示例,我只展示了构造函数和订阅操作符
[]

#include <iostream>
#include <algorithm>
#include <utility>
#include <cstdlib>

template<typename T>
class Vector{
  std::unique_ptr<T,decltype(&free)> elem{nullptr,free}; 
  std::size_t _size{};
  std::size_t _capacity{};

public:
      
  Vector() = default;
  ~Vector(){
    for(auto i = 0; i <_size; ++i){
      // invoke the destructor
    }

  }

  Vector(std::initializer_list<T> list): // pass by value
    elem{static_cast<T*>(malloc(list.size()*sizeof(T))), free},
    _size{list.size()},
    _capacity{list.size()}{

    std::uninitialized_copy(list.begin(), list.end(), elem.get());
  }


  auto& operator[](const std::size_t i){
    return elem[i];
  }

 const auto& operator[](const std::size_t i) const{
    return elem[i];
  }
  
  
  
};
问题似乎是我无法访问我的
unique\u ptr
I
-th元素,但我真的无法理解问题所在
如何修复此问题,以便我实现的所有其他功能都能正常工作?另外,我的
elem[i]
中的问题是
elem
是一个
唯一的\u prt

std::unique\u ptr
没有
操作符[]
,但是
std::unique\u ptr

所以你可以用

std::unique_ptr<T[], decltype(&free)> elem{nullptr,free}; 
std::unique_ptr elem{nullptr,free};
注意:为deleter使用类允许空基优化(EBO),并简化调用站点:

struct Free
{
    void operator()(void* p) const { free(p); }
};


std::unique_ptr<T[], Free> elem{nullptr}; 
struct-Free
{
void运算符()(void*p)常量{free(p);}
};
std::unique_ptr elem{nullptr};
std::unique\u ptr
没有
运算符[]
,但是
std::unique\u ptr

所以你可以用

std::unique_ptr<T[], decltype(&free)> elem{nullptr,free}; 
std::unique_ptr elem{nullptr,free};
注意:为deleter使用类允许空基优化(EBO),并简化调用站点:

struct Free
{
    void operator()(void* p) const { free(p); }
};


std::unique_ptr<T[], Free> elem{nullptr}; 
struct-Free
{
void运算符()(void*p)常量{free(p);}
};
std::unique_ptr elem{nullptr};

显示的代码显然是在错误的概念下运行的,
unique\u ptr
是一种类似数组的对象,它有一个重载的
[]
操作符?不是那样的
elem
是一个
std::unique\u ptr
。为了使
elem[i]
工作
std::unique\u ptr
需要重载
[]
操作符。“不,我明白你的意思了。但是我如何才能使我的
std::unique\u prt
具有
[]
运算符?您是指存储在
std::unique\u ptr
中的指针?使用其
get()
方法检索存储的指针,并在其上使用
[]
运算符。@SamVarshavchik就像
elem.get()[i]
?哦,您还必须在声明中添加括号:
std::unique\u ptr显示的代码显然是在错误的观念下运行的,
unique\u ptr
是一种类似数组的对象,它有一个重载的
[]
操作符?不是那样的
elem
是一个
std::unique\u ptr
。为了使
elem[i]
工作
std::unique\u ptr
需要重载
[]
操作符。“不,我明白你的意思了。但是我如何才能使我的
std::unique\u prt
具有
[]
运算符?您是指存储在
std::unique\u ptr
中的指针?使用其
get()
方法检索存储的指针,并在其上使用
[]
运算符。@SamVarshavchik就像
elem.get()[i]
?哦,您还必须在声明中添加括号:
std::unique\ptr