由于分配导致的c ++指针算术

mvx*_*xxx 4 c++ math pointers

我创建了一个包含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;
  }
};
Run Code Online (Sandbox Code Playgroud)

我的意思是这个部分:return &third + 1;.我知道如果有人对c ++中的指针算法知之甚少,那真的很危险.这些元素是否一个接一个地靠近?

Sto*_*ica 10

这些元素是否一个接一个地靠近?

它们可能是,因为它们具有完全相同的可访问性.但它仍然无法使您的实施安全.指针算法仅对同一数组对象中的元素有效.这三个不在同一个数组中,看不到阵列.任何使用这些迭代器的尝试都将导致未定义的行为.

我不确定你是否打算定义这个类,但是对于同一类型的三个元素的容器,我会提供更多的惯用语:

template<typename T>
using Troika = std::array<T, 3>;
Run Code Online (Sandbox Code Playgroud)

你失去了first,secondthird命名为成员,但获得索引(这是很好的,我认为)和迭代是免费的.

  • @ Rakete1111 - 不必,但可能.[但是,只要访问控制相同,地址就是顺序的](https://timsong-cpp.github.io/cppwp/n4659/class.mem#17). (2认同)