Пытаюсь получить доступ к элементу массива через его указатель, объявленный как shared_ptr так:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
{
shared_ptr<int> up(new int[5] {1,2,3,4,5});
cout << up[3];
}
getchar();
return 0;
}
Однако во время компиляции выдаётся ошибка о том, что "отсутствует оператор [], соответствующий этим операндам".
Я прочитал на cppreference и в подсказка среды разработки, что оператор [] у shared_ptr принимает тип ptrdiff_t, однако так:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
{
shared_ptr<int> up(new int[5] {1,2,3,4,5});
cout << up[static_cast<ptrdiff_t>(3)];
}
getchar();
return 0;
}
тоже не работает с той же ошибкой.
Вопрос: как всё-таки правильно пользоваться этим оператором и что я делаю не так?
Первая Ваша ошибка - попытка инициализировать std::shared_ptr<int> массивом, выделенным через new int[]. Это некорректно, так как shared_ptr<T> вызывает delete при освобождении памяти, а не требуемый delete[].
Замена int на int[] решает эту проблему и Вашу - умный указатель понимает, что на самом деле содержит в себе массив и позволяет его индексировать.