арифметика указателей в с ++ из-за выделения - PullRequest
0 голосов
/ 22 мая 2018

Я создал класс, который содержит 3 элемента одного типа (что-то вроде std::pair<T,std::pair<T,T>>).Более того, я подготовил его к использованию for(auto&var:t) Но я не знаю, сделал ли я это безопасно.

template <class T>
class Troika
{
public:
  Troika(const T& f, const T& s, const T& t)
    :first(f), second(s), third(t) {}
  Troika(){}

  T first;
  T second;
  T third;


  typedef T* iterator;
  typedef const T* const_iterator;

  iterator begin() 
  {
    return &first;
  }
  const_iterator begin() const
  {
    return &first;
  }
  iterator end()
  {
    return &third+1;
  }
  const_iterator end() const 
  {
    return &third + 1;
  }
};

Я имею в виду эту часть: return &third + 1;.Я знаю, что если кто-то не обладает огромными знаниями об арифметике указателей в c ++, это действительно опасно.Эти элементы расположены один за другим рядом друг с другом?

1 Ответ

0 голосов
/ 22 мая 2018

Расположены ли эти элементы один за другим рядом друг с другом?

Вероятно, так и есть, поскольку они имеют одинаковую доступность .Но это все еще не делает вашу реализацию безопасной.Арифметика указателей действительна только для элементов в том же массиве .Эти три не находятся в одном массиве, в поле зрения нет никакого массива.Любая попытка использовать эти итераторы приведет к неопределенному поведению.

Я не уверен в вашем намерении определить этот класс, но для контейнера из трех элементов одного типа я бы предложил более идиоматический:

template<typename T>
using Troika = std::array<T, 3>;

Вы теряете именованные элементы first, second и third, но получаете индексирование (что, я думаю, так же хорошо) и итерацию бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...