5

为什么下面的代码不受欢迎?

double d[4] = {0,1,2,3};
reinterpret_cast<double[2]>(d);

GCC 将其声明为 aninvalid cast from type 'double*' to type 'double [2]'并且 clang 声明reinterpret_cast from 'double *' to 'double [2]' is not allowed

现在,如果意图不明显,我希望这段代码返回一个包含 {0,1} 的 double[2],就像 areinterpret_cast<double*>(d)一样。(因此我知道它可以使用指针,所以这不是我要问的)

4

3 回答 3

9

你可能想要的是

double (&d2)[2] = reinterpret_cast<double(&)[2]>(d);

不确定它是否不是迂腐未定义的行为(作为 的大多数用法reinterpret_cast)。

于 2013-08-29T15:18:59.443 回答
4

两个编译器都是正确的。

reinterpret_cast不是锤子,它是一种强大的精密工具。的所有使用reinterpret_cast都必须涉及至少一个指针或引用类型作为源或目标,除了单位整数转换的退化情况(即允许reinterpret_castintint不做任何事情)。

于 2013-08-29T15:08:48.370 回答
0

您有一个大小为 4 的数组(不是指针)。由于大小不正确这一简单事实,您不能将其转换为大小为 2 的数组。一个类似的例子是你不能将一个类的实例转换为一个类的实例到另一个类的实例,因为这没有任何意义。要获得一个阵列,{0,1}您必须制作一个全新的阵列。

这是正确的方法:

     double d[4] = {0,1,2,3};                                                    
     double copy[2]{};                                                           
     std::copy_n(std::begin(d),2,std::begin(copy)); 

如果您不想创建数组的副本,惯用的做法是在范围而不是数组上操作,标准库中的每个算法都在迭代器而不是容器上操作是有原因的。

于 2013-08-29T15:05:44.750 回答