为什么对volatile int的const引用需要static_cast?

用户名

给出以下代码:

struct Foo { 
    volatile int i; 
};

const int& bar = foo.i; 

我得到:

error: invalid initialization of reference of type 'const int&' from expression of type 'volatile int'

除非我提供一个static_cast<volatile int>

特里斯坦·布林德尔

C ++中类型的“波动性”的工作方式与“ const-ness”几乎完全相同,也就是说,volatile无法将对象分配给非volatile引用,其方式与

const int i = 3;
int& j = i; // won't work

同样,只能volatile在volatile对象上调用标记的方法

struct S
{
    void do_something() volatile {}
    void do_something_else() {}
};

volatile S s;
s.do_something(); // fine
s.do_something_else(); // won't work

方法可以被“挥发性”所重载,就像它们可以被恒定性所重载一样。

在C ++ standardese中,这些东西称为cv-qualifiers,以强调它们以完全相同的方式工作。(C99添加了第三种以相同的方式工作,restrict在某些C ++编译器中可用作扩展)。您可以使用更改简历限定词const_cast<>-static_cast<>不需要更强大的功能

编辑:

为了明确起见,一个类型可以同时具有constvolatile修饰符,总共有四种可能性:

int i;
const int j;
volatile int k;
const volatile int l;

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

为什么重载函数的函数指针需要static_cast?

来自分类Dev

C ++为什么存在“ const volatile”类型限定符?

来自分类Dev

为什么此代码需要volatile关键字?

来自分类Dev

为什么volatile int可转换为int但volatile T无法转换为T?

来自分类Dev

为什么在C ++中不允许将static_cast从int(*)(int)转换为void *?

来自分类Dev

在有效的C ++项目3中,为什么使用static_cast <const TextBlock&>(* this)而不是static_cast <const TextBlock>(* this)?

来自分类Dev

为什么在gcc的is_nothrow_constructible实现中需要static_cast?

来自分类Dev

为什么我们不能使用rvalue volatile int &&初始化对const int的引用?

来自分类Dev

为什么std :: forward返回static_cast <T &&>而不返回static_cast <T>?

来自分类Dev

为什么在不使用static_cast的情况下对const void *进行类型转换是合法的,而不是C ++中的C ++

来自分类Dev

如果要将char提升为int,应该使用static_cast <int>(char变量)还是+(char变量),为什么?

来自分类Dev

static_cast int 引用int?

来自分类Dev

为什么不能static_cast双无效指针?

来自分类Dev

为什么不允许此static_cast?

来自分类Dev

为什么我的指针的static_cast失败?

来自分类Dev

为什么static_cast枚举类的基础类型为int8_t以获得意外的值?

来自分类Dev

为什么同时需要const引用和const成员函数?

来自分类Dev

为什么const int需要extern而不是const char *

来自分类Dev

为什么即使在使用Monitor时,不是所有成员变量都需要volatile以确保线程安全?(为什么该模型真正起作用?)

来自分类Dev

为什么在表达式上进行static_cast分配性作用?

来自分类Dev

为什么static_cast会为同一对象提供不同的内存位置?

来自分类Dev

为什么在C ++ 11中将static_cast用于自动指针?

来自分类Dev

为什么编译器不能(或不能)推断static_cast的类型参数?

来自分类Dev

为什么我可以取消引用并修改`int * const`指针?

来自分类Dev

为什么需要引用索引?

来自分类Dev

将 static_cast<int>(-15) 分配给 static const char 类型变量

来自分类Dev

C ++完美转发:如果可以使用const_cast(),为什么还需要forward()?

来自分类Dev

如何在引用int和作用域枚举之间进行static_cast?

来自分类Dev

为什么重载ostream的operator <<需要引用“&”?

Related 相关文章

  1. 1

    为什么重载函数的函数指针需要static_cast?

  2. 2

    C ++为什么存在“ const volatile”类型限定符?

  3. 3

    为什么此代码需要volatile关键字?

  4. 4

    为什么volatile int可转换为int但volatile T无法转换为T?

  5. 5

    为什么在C ++中不允许将static_cast从int(*)(int)转换为void *?

  6. 6

    在有效的C ++项目3中,为什么使用static_cast <const TextBlock&>(* this)而不是static_cast <const TextBlock>(* this)?

  7. 7

    为什么在gcc的is_nothrow_constructible实现中需要static_cast?

  8. 8

    为什么我们不能使用rvalue volatile int &&初始化对const int的引用?

  9. 9

    为什么std :: forward返回static_cast <T &&>而不返回static_cast <T>?

  10. 10

    为什么在不使用static_cast的情况下对const void *进行类型转换是合法的,而不是C ++中的C ++

  11. 11

    如果要将char提升为int,应该使用static_cast <int>(char变量)还是+(char变量),为什么?

  12. 12

    static_cast int 引用int?

  13. 13

    为什么不能static_cast双无效指针?

  14. 14

    为什么不允许此static_cast?

  15. 15

    为什么我的指针的static_cast失败?

  16. 16

    为什么static_cast枚举类的基础类型为int8_t以获得意外的值?

  17. 17

    为什么同时需要const引用和const成员函数?

  18. 18

    为什么const int需要extern而不是const char *

  19. 19

    为什么即使在使用Monitor时,不是所有成员变量都需要volatile以确保线程安全?(为什么该模型真正起作用?)

  20. 20

    为什么在表达式上进行static_cast分配性作用?

  21. 21

    为什么static_cast会为同一对象提供不同的内存位置?

  22. 22

    为什么在C ++ 11中将static_cast用于自动指针?

  23. 23

    为什么编译器不能(或不能)推断static_cast的类型参数?

  24. 24

    为什么我可以取消引用并修改`int * const`指针?

  25. 25

    为什么需要引用索引?

  26. 26

    将 static_cast<int>(-15) 分配给 static const char 类型变量

  27. 27

    C ++完美转发:如果可以使用const_cast(),为什么还需要forward()?

  28. 28

    如何在引用int和作用域枚举之间进行static_cast?

  29. 29

    为什么重载ostream的operator <<需要引用“&”?

热门标签

归档