对C样式数组的reinterpret_cast是非法的C++11
Is reinterpret_cast to C-style array illegal C++11?
为什么下面的代码不受欢迎?
double d[4] = {0,1,2,3};
reinterpret_cast<double[2]>(d);
GCC声明它为invalid cast from type 'double*' to type 'double [2]'
,clang声明reinterpret_cast from 'double *' to 'double [2]' is not allowed
现在,如果意图不明显,我希望这段代码返回一个包含{0,1}的double[2],就像reinterpret_cast<double*>(d)
一样。(因此,我知道它可以与指针一起工作,所以这不是我所要求的)
您可能想要的是
double (&d2)[2] = reinterpret_cast<double(&)[2]>(d);
但不确定它是否是学究式的未定义行为(就像reinterpret_cast
的大多数用法一样)。
两个编译器都是正确的。
reinterpret_cast
不是锤子,它是一种强大的精密工具。reinterpret_cast
的所有使用都必须涉及至少一个指针或引用类型作为源或目标,但单位积分转换的退化情况除外(即允许reinterpret_cast
从int
转换为int
,但不执行任何操作)
您有一个大小为4的数组(而不是指针)。您不能将其强制转换为大小为2的数组,原因很简单,即大小不正确。一个类似的例子是,不能将一个类的实例强制转换为另一个类实例,因为这没有任何意义。要获得一个具有{0,1}
的数组,您必须制作一个全新的数组。
以下是正确的方法:
double d[4] = {0,1,2,3};
double copy[2]{};
std::copy_n(std::begin(d),2,std::begin(copy));
如果你不想创建数组的副本,习惯做法是对范围而不是数组进行操作,那么标准库中的每个算法都对迭代器而不是容器进行操作是有原因的。
相关文章:
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- C++中的移动分配出现问题.非法指令: 4.
- while 循环 c++ 中的非法指令
- 使用 ISdigit 通知任何检测到的非法字符
- 非法,左操作数具有类型 'DWORD [29]'
- 来自 VS C++ 在 Windows 上的非法指令
- WinLamb 错误:成员初始化非法
- 错误:"cast"未命名类型void setCastDescription(std::string
- "class":非法使用此类型作为表达式 如何解决?
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- AVX512 非法指令
- 在Visual Studio中查找非法内存访问
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- 为什么基于范围类型的大括号上循环init列表是非法的c++
- CUDA非法访问内核内存
- 来自简单循环的 OpenAcc 错误:内核执行期间的非法地址
- 'function-style cast' : 作为操作员右侧'.'非法