如果我没记错的话,由于严格的别名规则,通过指针算法访问多维数组的第二行是未定义的行为。

有一项提议称为 mdspan ,据我了解,该提议旨在提供多维数组 View 。如何在不违反严格的别名规则的情况下实现此类?

解决方法可能是reinterpret_cast将数据来回往复到char *。但是,我看了一下this reference implementation,却没有看到这样的东西。

这是引用实现的摘录:

template < typename DataType , class ... Properties >
class mdspan
{
public:
  // ...
  using element_type = DataType ;
  using pointer      = element_type * ;
  using reference    = element_type & ;

private:
  pointer  m_ptr ;
  mapping  m_map ;

public:
  // ...

  template < class ... IndexType >
  explicit constexpr mdspan
    ( pointer ptr , IndexType ... DynamicExtents ) noexcept
    : m_ptr(ptr), m_map( DynamicExtents... ) {}


  // ...

  template< class ... IndexType >
  constexpr reference
  operator()( IndexType ... indices) const noexcept
    { return m_ptr[ m_map( indices... ) ]; }
};

最佳答案

我意识到我误会了整个事情。该提案明确指出:



因此,它被设计为一维数组的多维 View ,没有混叠问题。

我在其他地方读过,它打算替换像f(double [][5],int)这样的代码,这让我感到困惑。

关于c++ - mdspan和严格的别名规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49665881/

10-11 15:18