Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组在并集中重叠?_C++_C++11 - Fatal编程技术网

C++ 数组在并集中重叠?

C++ 数组在并集中重叠?,c++,c++11,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_; }; 如果没有union,我将无法在constexpr构造函数中初始化矩阵 如果没有union,我将无法在constexpr构造函数中初始化矩阵 事实上,你可以。您只需停止将平面阵列视为构建的一

我有这门课:

template <typename T, ::std::size_t M, ::std::size_t N>
struct matrix
{
private:
  union
  {
    T idata[M * N];
    T data[M][N];
  } u_;
};
如果没有union,我将无法在
constexpr
构造函数中初始化矩阵

如果没有union,我将无法在
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
};
模板
结构矩阵
{
模板constepr矩阵(U&…参数);
私人:
T idata[M*N];
constexpr T&data(size_ti,size_tj){return idata[i*N+j];}
//我肯定这个类还有很多其他有用的成员,但我没有列出它们
};

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

这有点棘手。这两个数组保证占用相同的空间量,但不允许读取非活动的联合成员,也不允许超出数组界限。编译器可以检测到UB并优化整个代码。因为“一个指向联合的指针,经过适当转换,指向它的所有成员”,我认为这是有保证的。但是,在写入另一个成员后,您无法访问该联盟的一个成员,因为这是未定义的行为。@MatteoItalia:这不会编译,因为
a
t(*)[M]
,而不是
t*
。充其量,您可以使用
T*p=&a[0][0]
并使用
p[i]
(这基本上就是我所做的)。如果这些数组是布局兼容的,那么通过它们中的任何一个进行访问甚至都将被定义为行为。如果它们有相同的对齐要求,用外行的话说,甚至可能是这样。据我所知,该标准不包含与阵列兼容的布局定义。@KerrekSB:for
int(*p)[N]
,是(限于范围
0..m
)。但是
int*p
并没有这样的限制,所以可以使用落在同一个完整对象中的任何偏移量。既然
没有用于聚合的私有或受保护的非静态数据成员(第11条)
,怎么会这样呢?这对我来说是一个限制因素。我的意思是,你不应该提供任何私有成员,否则就我所知,聚合初始化将不起作用。在
constexpr
-可用的类型中有私有成员是没有限制的
matrix
不是聚合,它的
idata
成员是聚合,并且可以根据需要在
constexpr
构造函数中初始化,使用您在问题中展示的技术。@用户:它不是类型的完整定义,只是问题中显示的部分。您的问题有一个未在类主体中声明的构造函数。我也这么做了。我只是说明
data
可以是一个内联函数而不是数据成员,而不需要对
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
};