mdspan和严格的别名规则

时间:2018-04-05 06:52:31

标签: c++ undefined-behavior strict-aliasing

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

有一个名为mdspan的提案,在我的理解中旨在提供一个多维数组视图。如何在不违反严格别名规则的情况下实现这样的类?

解决方法可能是来回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... ) ]; }
};

1 个答案:

答案 0 :(得分:1)

我意识到我误解了整件事。该提案明确指出:

  

建议的多态多维数组引用(mdspan)定义了用于将索引从多维索引空间(域)映射到连续跨对象(codomain)成员的类型和函数。

因此,它被设计为一维数组的多维视图,没有别名问题。

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