C++ 1d智能指针不';t使用语法(*)和#x2B+;

C++ 1d智能指针不';t使用语法(*)和#x2B+;,c++,c++17,visual-studio-2019,smart-pointers,C++,C++17,Visual Studio 2019,Smart Pointers,我正在学习智能指针。所以,我用箭头标出了我不懂的代码。代码如下所示。我在VisualStudio2019中尝试了以下代码。 为什么我不能使用增量运算符(*i)+其中我可以使用i[0]++ shared_ptr<int[]> foo(shared_ptr<int[]>i) { cout << i << '\n'; (*i)++; // doesn't but works for shared_pt

我正在学习智能指针。所以,我用箭头标出了我不懂的代码。代码如下所示。我在VisualStudio2019中尝试了以下代码。 为什么我不能使用增量运算符(*i)+其中我可以使用i[0]++

shared_ptr<int[]> foo(shared_ptr<int[]>i)
{
    cout << i << '\n';
    (*i)++;             // doesn't        but works for shared_ptr<int>i as argument
    i[0]++;            //  works             
    *i += 1;          // <--  doesn't  work
    i[0] += 1;        // <--- works 
    return i;
}

int main(int argc)
{
  
    auto start = chrono::high_resolution_clock::now();
   // int T;
    //cin >> T;
   // while (T--)
  //  {
        std::unique_ptr<int[]> pointer(new int[5]);                 // <-- can  do it 
        for (int i = 0; i < 5; ++i) pointer[i] = i;

        auto pointer3 = make_unique<int[] >(new int[5]);  // <--- can't do it Okay i know that there is no overload but what's reason for not having ?
        cout << pointer << '\n';
        auto pointer1 = std::move(pointer);
        cout << pointer1 << '\n';
        auto shrd_ptr = foo(std::move(pointer1));
        cout << shrd_ptr << '\n';
  //  }
    auto end = chrono::high_resolution_clock::now();
    cout << std::chrono::duration_cast<std::chrono::milliseconds>(end -start).count() <<'\n';
    return 0;
}

如果
shared\u ptr
存储了一个数组,那么(并且只有在那时)
shared\u ptr::operator[]
提供了对存储数组中各个元素的访问

shared\u ptr::operator*
提供对整个存储对象的访问。它是为所有类型的存储对象定义的。如果这是一个数组,那么这就是整个数组


这是对标准C/C++数组/指针语义的有意背离,其中
*x
x[0]
在定义上是一回事
shared_ptr
不会这样做,因为它的设计者不希望它这样做。

这是因为智能指针是指向数组的指针,例如,
(*i)+
可以尝试更改数组的起始位置。它基本上与执行
intarr[10]相同;arr++。为什么不将智能指针视为数组,并使用
i[0]++
?或者更好地使用
std::vector
std::array
?我的建议是,不要将智能指针视为自删除指针,而是从所有权的角度来看。一个资源一次应该只有一个所有者吗?使用
std::unique\u ptr
。资源的所有权可以共享吗?然后使用
std::shared\u ptr
。在我看来,对本质上是数组或向量的内容使用手动和显式内存处理(或智能指针)几乎毫无意义。
[]
版本的
shared\u ptr
不允许您取消对
*
的引用。我认为这是一个阻止数组和指针合并的设计决策。如果您想要一个
shared\u ptr
元素,可以使用别名c'tor:
std::shared\u ptr(i,i.get()+索引)
的生存期是从
i
开始的,但poitner是从
i.get()+index
开始的。你不能从
unique\u ptr
转换到
shared\u ptr
,因为正如@Someprogrammerdude所说,这会破坏目的,但你可以做
std::shared\u ptr sp=std::move(向上)其中
up
是一个
std::unique\u ptr
。这意味着如果您有一个函数,
f
,返回一个
std::unique_ptr
,您可以执行
std::shared_ptr sp=f()。在这一点上,没有办法回到
唯一的\u ptr
    Error C2088   '++': illegal for class 
    Error C2100   illegal indirection 
    Error (active)    E0349   no operator "*" matches these operands  
    Error (active)    E0349   no operator "*" matches these operands  
    Error (active)    E0042   no instance of overloaded fucntion "make_unique" matches the argument list