联合中重叠的数组?

use*_*108 3 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_;
};
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

template <typename ...U>
constexpr matrix(U&&... args) : u_{{::std::forward<U>(args)...}}
{
}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*igt 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
};
Run Code Online (Sandbox Code Playgroud)

编译器也应该为它生成相同的代码.

  • @user:你已经违反了这个要求. (2认同)