将float*强制转换为std::complex<合法吗;浮动>*
Is it legal to cast float* to std::complex<float>*
N3797
26.4[复数]说明了将std::complex<T>*
转换为T*
4此外,如果a是类型为
cv std::complex<T>*
的表达式,并且表达式a[i]
是为整数表达式i
定义的,则:
-reinterpret_cast<cv T*>(a)[2*i]
应指定a[i]
的实部,且
-reinterpret_cast<cv T*>(a)[2*i + 1]
应指定a[i]
的虚部。
这(或标准的其他措辞)是否意味着我可以用其他方式reinterpret_cast
?我可以这样做吗:
float * pf;
std::complex<float>* pc = reinterpret_cast<std::complex<float>*>(pf);
pc[i].real();
正如下面n.m.指出的,我必须确保pf
的排列适合std::complex<float>
。这可以被认为得到了处理。
不,该条款没有这样的保证。
现在,在实践中,最常见的问题是一致性:但即使这样也可能很少见。
第二个问题将涉及严格的混叠,其中作为double
分配的内存可以被编译器假设为不被任何涉及到其他类型(char
除外)的指针的操作修改。上面的限制指向另一个方向(complex
分配的指针可能不会假设所有double*
都不指向其数据),但不会指向您想要的方向。同样,这是相对模糊的,但编译器可以使用它来重新排序代码中的写入。
然而,它通常会起作用。更常见的情况是,如果您将其对齐,并且编译器不使用严格的别名假设:然而,即使这样,根据标准,它也是未定义的行为。
反之则不然。std::complex<float>
是内存中连续的两个float
,标准允许您这样做,但您有一个指向单个浮点值的指针,并将其转换为指向应该包含两个浮点的结构的指针。即使您有两个浮点,标准也不能保证它,因此reinterpret_cast
指向该方向的指针是非法的。
- EASTL矢量<向量<int>>连续的
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 没有从阵列<float>到阵列<int>的可行转换
- 数组下标的类型"float*[float]"无效
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 将 **float array 从 C++ Dll 传递给 python
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- float* 已在 Gameobject.obj 中定义
- 如何将 qml 的文本转换为 float 和 int
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- 有没有比static_cast更优雅的从int到float的演员阵容<float>?
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 错误:无法将"float*"转换为"float"
- 如何在函数中将字符串和分数存储为(Int 或 float)
- 缩小从double到float的转换
- 着色器将uint8投射到float,并将其重新解释回uint
- 我一直收到错误"cannot convert 'float*' to 'float' in return"
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>