3

我有这堂课:

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构造函数中初始化矩阵。

4

1 回答 1

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
};

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

于 2013-10-14T21:07:08.077 回答