联合中重叠的数组?

时间:2013-10-14 20:45:59

标签: c++ c++11

我有这堂课:

template <typename T, ::std::size_t M, ::std::size_t N>
struct matrix
{
private:
  union
  {
    T idata[M * N];
    T data[M][N];
  } u_;
};

我使用idata联合成员来初始化矩阵,并使用data成员进行访问。这两个数组似乎完全重叠在我的用例中。标准是否保证始终如此?也就是说,u_.idatau_.data都具有相同的起始地址和相同的大小?

编辑:

我使用这个constexpr构造函数来初始化矩阵:

template <typename ...U>
constexpr matrix(U&&... args) : u_{{::std::forward<U>(args)...}}
{
}

如果没有联合,我将无法在constexpr构造函数中初始化矩阵。

1 个答案:

答案 0 :(得分:6)

  

如果没有联合,我将无法在constexpr构造函数中初始化矩阵。

实际上,你可以。你只需要停止将平面阵列视为构造的解决方法。

这将有效:

template <typename T, ::std::size_t M, ::std::size_t N>
struct matrix
{
  template <typename ...U> constexpr matrix(U&&... args);
private:
  T idata[M * N];
  constexpr T& data( size_t i, size_t j ) { return idata[i*N+j]; }

  // I'm sure the class has many other useful members but I'm not listing them
};

编译器也应为此生成相同的代码。