将int * const强制转换为long int * const警告

code_fodder

以前可能已经以其他方式提出了这个问题(如果不是这样的话,我会感到惊讶),但是我很难找到它。

鉴于:

#include <iostream>
#include <string>

int main()
{
    int * const pi = new int(1);
    long int * const pl = reinterpret_cast<long int * const>(pi);
    std::cout << "val: " << *pl << std::endl;
    return 0;
}

我得到警告:

<source>: In function 'int main()':
<source>:7:27: warning: type qualifiers ignored on cast result type [-Wignored-qualifiers]
    7 |     long int * const pl = reinterpret_cast<long int * const>(pi);
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASM generation compiler returned: 0
<source>: In function 'int main()':
<source>:7:27: warning: type qualifiers ignored on cast result type [-Wignored-qualifiers]
    7 |     long int * const pl = reinterpret_cast<long int * const>(pi);
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Execution build compiler returned: 0
Program returned: 0
val: 1

但我不确定为什么会收到此警告,因为重铸也应该是const指针-只是指向其他类型。我想实现相同的代码(如果忽略警告,则可以使用),但是没有警告。

Yakk-亚当·内夫罗蒙特

long int * const 是指向可变数据的不变指针。

reinterpret_cast返回一个临时对象。在大多数临时对象(包括该对象)上,顶级类型的不变性是无关紧要的。

这个:

long int * const pl = reinterpret_cast<long int * const>(pi);

是相同的

long int * const pl = reinterpret_cast<long int *>(pi);

编译器警告你,因为想必你以为打字const做了什么,你是错的,它什么也没做。


现在,这与您的要求没有直接关系,但是如果我不提及这一点,我将不为所动:

std::cout << "val: " << *pl << std::endl;

导致您的程序表现出不确定的行为。指向的对象不是long int,它是int,并且您以其类型不是该对象的形式访问它。

reinterpret_cast尽管许多人都将其视为“字节”,但它不是“将这些字节作为不同的类型进行处理”。在C ++标准下,此类操作几乎总是未定义的行为。

将对象A的字节解释为类型B的对象(当它们是普通类型时)的正确方法是使用memcpy

int * const pi = new int(1);
long int l = 0;
static_assert( sizeof(*pi) == sizeof(l) );
::memcpy( &l, pi, sizeof(l) ); // or l = std::bit_cast<long int>(*pi) in C++20
std::cout << "val: " << l << std::endl;

如果实现定义了输出,这是合法的,因为您可以随意复制足够琐碎的类型的字节,并且long int必须没有陷阱值。


在C ++中,没有合法的方法可以将内存块作为along int和作为a进行读取/写入int允许在C ++中使用别名(将一种类型当作另一种类型)的数量是有限的,因为违反别名会使某些真正强大的优化变得不可能或不切实际。

当您执行此类操作时,许多程序会忽略此事实,而是依靠编译器生成“幼稚”程序集。他们正在生成表现出未定义行为的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将vector <int>强制转换为const vector <const int>

来自分类Dev

将vector <int>强制转换为const vector <const int>

来自分类Dev

将Const char *转换为Unsigned long int-strtoul

来自分类Dev

将long int转换为const time_t

来自分类Dev

无法将'int'转换为'const char *'

来自分类Dev

const从unsigned int引用强制转换的int

来自分类Dev

C ++无法将参数1从'int **'转换为'const int **'

来自分类Dev

错误:无法将'int *(*)[10]'转换为'const int *(*)[10]'

来自分类Dev

C ++无法将参数1从'int **'转换为'const int **'

来自分类Dev

将const char *类型转换为int数组

来自分类Dev

将unsigned long long int强制转换为signed long long int可能吗?

来自分类Dev

在C#中强制转换为“ int”时,“ const float”值与“ float”不同

来自分类Dev

在C#中强制转换为“ int”时,“ const float”值与“ float”不同

来自分类Dev

c-将指向const int的指针转换为仅指向int的指针(并对其进行修改)

来自分类Dev

解决了“警告:从'int'转换为'long unsigned int'的问题”

来自分类Dev

C ++-错误C2664:'int scanf(const char *,...)':无法将参数1从'int'转换为'const char *'

来自分类Dev

将Constexpr强制转换为const char []

来自分类Dev

将double分配给const int&,将int分配给const int&

来自分类Dev

为什么我没有收到将指针强制转换为int的警告?

来自分类Dev

将[Int?]转换为[Int]

来自分类Dev

错误:从'const int *'到'int *'的无效转换

来自分类Dev

从'const int *'到'int *'的无效转换

来自分类Dev

当double为常数时,为什么g ++ -Wconversion不警告将double转换为long int?

来自分类Dev

从不同大小的整数转换为指针(将int作为const void *参数传递)

来自分类Dev

尝试将int转换为const char时出现分段错误

来自分类Dev

如何正确地将NSNumber强制转换为long long int?

来自分类Dev

iOS将const char与int连接

来自分类Dev

当将Int64强制转换为Int32时,为什么C#让我溢出而没有任何错误或警告,它如何执行强制转换?

来自分类Dev

C / C ++将void *强制转换为int(*())(int,...);

Related 相关文章

  1. 1

    将vector <int>强制转换为const vector <const int>

  2. 2

    将vector <int>强制转换为const vector <const int>

  3. 3

    将Const char *转换为Unsigned long int-strtoul

  4. 4

    将long int转换为const time_t

  5. 5

    无法将'int'转换为'const char *'

  6. 6

    const从unsigned int引用强制转换的int

  7. 7

    C ++无法将参数1从'int **'转换为'const int **'

  8. 8

    错误:无法将'int *(*)[10]'转换为'const int *(*)[10]'

  9. 9

    C ++无法将参数1从'int **'转换为'const int **'

  10. 10

    将const char *类型转换为int数组

  11. 11

    将unsigned long long int强制转换为signed long long int可能吗?

  12. 12

    在C#中强制转换为“ int”时,“ const float”值与“ float”不同

  13. 13

    在C#中强制转换为“ int”时,“ const float”值与“ float”不同

  14. 14

    c-将指向const int的指针转换为仅指向int的指针(并对其进行修改)

  15. 15

    解决了“警告:从'int'转换为'long unsigned int'的问题”

  16. 16

    C ++-错误C2664:'int scanf(const char *,...)':无法将参数1从'int'转换为'const char *'

  17. 17

    将Constexpr强制转换为const char []

  18. 18

    将double分配给const int&,将int分配给const int&

  19. 19

    为什么我没有收到将指针强制转换为int的警告?

  20. 20

    将[Int?]转换为[Int]

  21. 21

    错误:从'const int *'到'int *'的无效转换

  22. 22

    从'const int *'到'int *'的无效转换

  23. 23

    当double为常数时,为什么g ++ -Wconversion不警告将double转换为long int?

  24. 24

    从不同大小的整数转换为指针(将int作为const void *参数传递)

  25. 25

    尝试将int转换为const char时出现分段错误

  26. 26

    如何正确地将NSNumber强制转换为long long int?

  27. 27

    iOS将const char与int连接

  28. 28

    当将Int64强制转换为Int32时,为什么C#让我溢出而没有任何错误或警告,它如何执行强制转换?

  29. 29

    C / C ++将void *强制转换为int(*())(int,...);

热门标签

归档