失去限定符的c++转换
Qualifier-losing conversion C++
当注释标记被删除时,下面的代码在MSVC2015和clang中都无法编译,但它会按原样编译。
int main()
{
static_assert( alignof( int * ) == alignof( int * * ), "nope" );
const int * * a = nullptr;
//const int * * * b = reinterpret_cast< const int * * * >( a );
auto c = static_cast< const int * * * >( static_cast< void * >( a ) );
return 0;
}
这个问题与之前的问题不同,因为没有抛弃整体的const
限定符。
根据标准[expr. reinterpretation .cast]/7
对象指针可以显式地转换为不同类型的对象指针。将对象指针类型的右值
v
转换为对象指针类型"指向cv T
的指针",结果为static_cast<cv T*>(static_cast<cv void*>(v))
。
在这种情况下,目标"指向cv T
的指针"是const int * * *
,这使得T = const int * *
而没有cv
限定符。因此,结果应该是static_cast<T*>(static_cast<void*>(v))
。
有关于T
对齐的约束,但这些约束在这里不相关,如静态断言所示。由于reinterpret_cast< const int * * * >( a )
的结果实际上可以使用中间步骤计算,因此注释的代码在没有注释的情况下应该可以编译。
我的推理错误在哪里(如果有的话)?
N3690 5.2.11/8:
下面的规则定义了称为的丢弃constness的过程。在这些规则中,
Tn
和Xn
表示类型。对于两个指针类型:
X1
T1
cv <子> 1,1 子>*
……cv1,N*
,其中T1
不是指针类型
X2
T2
cv <子> 2,1 子>*
……cv2,M*
其中T2
不是指针类型K为min(N,M)
如果对于非指针类型
到 的隐式转换(第4条),则从T
不存在从X1
到X2
的强制转换将放弃constness:
T
cv <子> 1,(N - K + 1) 子>*
cv <子> 1,(N - K + 2) 子>*
……cv1,N*
T
cv <子> 2 (M - K + 1) 子>*
cv <子> 2 (M - K + 2) 子>*
……cv2、M*
在您的示例中,X1
为const int**
,因此N为2,T1
为int
, cv1,1为const
, cv1,2为空。X2
为const int***
,因此M为3,T2
为int
, cv2,1为const
, cv2,2和cv2,3为空。K为2。是否存在从
T
cv <子> 1,1 子> *
cv <子> 1,2 子> *
= T const**
T
cv <子> 2,2 子> *
cv <子> 2,3 子> *
= T**
?
没有;因此你的cast抛弃了constness。
当然我们有5.2.10/2:
reinterpret_cast
操作符不能丢弃constness(5.2.11)。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++