我有这堂课:
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_.idata
和u_.data
都具有相同的起始地址和相同的大小?
编辑:
我使用这个constexpr
构造函数来初始化矩阵:
template <typename ...U>
constexpr matrix(U&&... args) : u_{{::std::forward<U>(args)...}}
{
}
如果没有联合,我将无法在constexpr
构造函数中初始化矩阵。
答案 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
};
编译器也应为此生成相同的代码。