cv type qualifiers
CV%28 const和挥发性%29类型限定符
出现在任何类型的说明符中,包括声明语法指定所声明的对象或所命名类型的对象的一致性或波动性。
const
-定义类型为常量
...
volatile
-定义类型为易挥发
...
mutable
-适用于非静态班级成员非引用非Const类型,并指定成员不影响经常用于互斥、备注缓存、延迟计算和访问工具%29的类%28的外部可见状态。mutable
成员康斯特
类实例是可修改的。%28注:C++语言语法处理mutable
作为存储类说明符,但它不影响存储类。
解释
任何类型T
%28包括不完整类型%29,但不包括功能类型或参考类型,C++类型系统中有三种不同的类型:T
,易挥发-合格T
,康斯特-易挥发-合格T
.注:数组类型被认为具有与它们的元素类型相同的cv限定。
第一次创建对象时,cv-限定符使用%28,它可能是decl-说明符-seq的一部分,也可能是声明中的类型id的一部分。新表达式%29确定物体的稳定性或波动性如下:
Const对象
-其类型为Const限定的对象,或Const对象
的不可变的子对象。这样的对象不能修改:试图直接这样做是编译时错误,并且试图间接地这样做%28e。通过引用或指向非Const类型%29的指针修改Const对象
,会导致未定义的行为。
挥发性物体
-其类型为易失性-限定的对象,或易失性对象的子对象,或康斯特-易失性对象的可变子对象。通过可变限定类型的glvalue表达式进行的每次访问%28读或写操作、成员函数调用等都被视为优化目的%28--也就是说,在执行的单个线程中,无法通过另一个可见的副作用优化或重新排序易失性访问排序-前或者排序-在易失性访问之后。这使得易失性对象适合与信号处理程序,但不是另一个执行线程,请参见std::memory_order
29%。通过非易失性对象引用易失性对象的任何尝试。极值%28等。通过指向非易失性类型的引用或指针,%29将导致未定义的行为。
Const挥发性物体
-一个类型为Const-Volative-Quantity的对象,一个Const易失性对象的不可变子对象,一个易失性对象的Const子对象,或一个Const对象不可变的易失性子对象。行为既是Const对象,也是易失性对象。
cv-限定符按递增限制的顺序进行偏序。这种类型可以说再多点
或再少点
简历-合格:
- 不合格<const
- 不合格<volatile
- 不合格<const volatile
- const<const volatile
- volatile<const volatile
对cv限定类型的引用和指针可能为隐式转换的引用和指针更多的简历-合格
类型。特别是允许进行下列转换:
- 引用/指针
不合格
类型可以转换为引用/指针到const
- 引用/指针
不合格
类型可以转换为引用/指针到volatile
- 引用/指针
不合格
类型可以转换为引用/指针到const volatile
- 引用/指针
const
类型可以转换为引用/指针到const volatile
- 引用/指针
volatile
类型可以转换为引用/指针到const volatile
注:附加限制是强加在多层指针上的。
若要将指向cv限定类型的引用或指针转换为引用或指向减cv-合格
类型,康斯特[医]铸造一定要用。
关键词
const
,,,volatile
,,,mutable
...
例
二次
int main()
{
int n1 = 0; // non-const object
const int n2 = 0; // const object
int const n3 = 0; // const object (same as n2)
volatile int n4 = 0; // volatile object
const struct
{
int n1;
mutable int n2;
} x = {0, 0}; // const object with mutable member
n1 = 1; // ok, modifiable object
// n2 = 2; // error: non-modifiable object
n4 = 3; // ok, treated as a side-effect
// x.n1 = 4; // error: member of a const object is const
x.n2 = 4; // ok, mutable member of a const object isn't const
const int& r1 = n1; // reference to const bound to non-const object
// r1 = 2; // error: attempt to modify through reference to const
const_cast<int&>(r1) = 2; // ok, modifies non-const object n1
const int& r2 = n2; // reference to const bound to const object
// r2 = 2; // error: attempt to modify through reference to const
// const_cast<int&>(r2) = 2; // undefined behavior: attempt to modify const object n2
}
二次
产出:
二次
# typical machine code produced on an x86_64 platform
# (only the code that contributes to observable side-effects is emitted)
main:
movl $0, -4(%rsp) # volatile int n4 = 0;
movl $3, -4(%rsp) # n4 = 3;
xorl %eax, %eax # return 0 (implicit)
ret
二次
另见
C文档用于Const限定符
*。
挥发性限定符的C文档
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。