mutable与const修饰词的对称性

原创 2003年10月28日 23:43:00

mutableconst修饰词的对称性

 

smilemac

 

恐怕没有程序员会反对在该使用const的地方使用const,但大部分程序员却非常反对使用mutable,所以也很少注意mutableconst的对称性。

 

我们知道,const是一种语义与语法统一得非常好的修饰词,这在C++中其实并不多见,C++很多语法概念在语义上是模糊不清的,但const却是一个异数。const承诺的是一旦某个变量被其修饰,那么只要不使用强制转换,在任何情况下该变量的值都不会被改变,无论有意还是无意,而被const修饰的函数也一样,一旦某个函数被const修饰,那么它便不能直接或间接改变任何函数体以外的变量的值,即使是调用一个可能造成这种改变的函数都不行。这种承诺在语法上也作出严格的保证,任何可能违反这种承诺的行为都会被编译器检查出来。

 

使用const,我们可以声明一部分具有invariant性质的规格,这样的例子有很多,本文不赘述了,本文重点论述以下mutable

 

mutable虽然不如const受重视,但如同const一样,mutableC++中少有的一些具有清晰语义的修饰词之一。

 

mutable的承诺是如果某个变量被其修饰,那么这个变量将永远处于可变的状态,即使在一个const函数中。这与const形成了一个对称的定义,一个永远不变,而另外一个是永远可变。

 

有某种说法是只有那些不改变对象外部行为特征的内部变量才可以被声明为mutable,其实不完全这样。

 

这个世界有一些东西是永恒的,但有些东西又是永远都处于变化中的,即使你将其他所有与之相关的东西都声明为永恒,它依旧可以发生变化,因为一旦它变得永恒,那么它所代表的东西也便失去了存在的意义,这便是mutable的含义。

 

一个现成的例子便是ScopeGuard, 看过它的实现的读者都知道,它主要的一个类ScopeGuardImplBase中使用了mutable[2]

 

class ScopeGuardImplBase
{
public:
    void Dismiss() const throw()
    {    dismissed_ = true;    }

 
protected:
    ScopeGuardImplBase() : dismissed_(false)
    {}
    ScopeGuardImplBase(const ScopeGuardImplBase& other)
    : dismissed_(other.dismissed_)
    {    other.Dismiss();    }
    ~ScopeGuardImplBase() {} 

    mutable bool dismissed_;
 
private:
    // Disable assignment
    ScopeGuardImplBase& operator=(
        const ScopeGuardImplBase&);
}; 

在这个例子中我们可以看到,状态变量dismissed被声明成了mutable,我们姑且不管原作者的本意是否仅仅是作为一种技巧使用,目的是为了绕过必须const引用临时变量的限制,我们只从语义学的角度考察,答案是明显的,不管在任何情况下,dismissed都应该是可变的,否则整个ScopeGuard都失去了原意。它代表这样一种规格:此类型(指ScopeGuard)的变量无法被声明为const,(即使你做了这样的声明也是无效的)。

 

当然,同样的规格也可以通过const作出,比如上例中如果不将函数Dismiss()声明为const,那么也可基本表达同样的规格,但问题在于,你不能假设用户的使用环境,因为ScopeGuard定义为它可以在离开定义的区间时执行任何指定动作,而对动作本身并没有做约束,因此你必须假定用户也有可能将某个或某几个ScopeGuard对象的引用传入一个const函数中(这样做在某些情况中是有益的)。在这种条件下,mutable是必要的。

 

这样的例子还可以举出一些,比如一个log对象,一个constantlog对象是没有意义的,它的存储变量必须是mutable的。再比如一个访问计数器,某些特殊对象所拥有的dirty标志等等。

 

而从语言的角度来看,有const就必须有mutable这样完全相反的修饰子,否则便不成为一个完全的划分。

 

其实很难找到语义与语法结合的如此好的修饰词了,你看一个变量或函数是否应该是const,只需看它在你的设计空间中是否应该是constantinvariant,而看一个变量是否应该是mutable,也只需看它是否在你的设计空间是forever mutative

 

这种相反并且对称的属性,两者交集为空,使得mutable能够完全否定const作出的约束。二者组合使用,可以赋予一个对象更多的规格选择。而这种对称,仔细品味,你会发现其含义余味无穷,具有很强的审美性质。

 

 

参考文献:

1. ISO/IEC 14882, “Programming Languages C++, 1998

2. Andrei Alexandrescu and Petru Marginean ,“Change the Way You Write Exception-Safe Code — Forever”,CUJ, Dec 2002

 

 

〈完〉

 

 

 

mutable与const修饰词的对称性

mutable与const修饰词的对称性 smilemac 恐怕没有程序员会反对在该使用const的地方使用const,但大部分程序员却非常反对使用mutable,所以也很少注意mutable与con...
  • cglover
  • cglover
  • 2007年05月21日 16:41
  • 380

mutable与const修饰词的对称性zz

mutable与const修饰词的对称性 smilemac 恐怕没有程序员会反对在该使用const的地方使用const,但大部分程序员却非常反对使用mutable,所以也很少注意mutable与con...
  • linrix
  • linrix
  • 2006年11月26日 10:51
  • 939

关于修饰词const

const在编程中经常遇到,包括全局变量和局部变量的修饰,函数参数的修饰,函数返回值的修饰等,下面我们来一步步的回顾下有关const关键词的一些用意和疑问,并重新梳理一下const是何许人也? ...
  • wzp_moon
  • wzp_moon
  • 2015年09月19日 16:32
  • 211

const成员函数和mutable

const成员函数和mutable 标签: iostreamconstructorclasslistc 2010-05-05 10:14 1154人阅读 评论(0) 收藏 举报 ...
  • boshuzhang
  • boshuzhang
  • 2016年06月26日 13:00
  • 283

C++回顾之const对象、const成员函数、mutable类型

总结const的各种用法,主要讲述const对象,及const 成员函数,还有mutable修饰的数据成员...
  • ab198604
  • ab198604
  • 2014年02月08日 11:02
  • 3495

const volatile mutable的总结

const 一.一般应用 1.const修饰各种变量的用法. a.取代define #define D_INT 100 #define D_LONG 100.29 ...
  • IT_LOVER_
  • IT_LOVER_
  • 2016年08月21日 21:44
  • 199

C语言中的修饰词const

const 1. 什么是const const表示不变的意思,用于修饰变量,希望将变量变成“常量”,这个常量有点水分,是个伪常量,后面介绍。 2. const对普通变量的修饰 int cons...
  • yangguoyu8023
  • yangguoyu8023
  • 2017年05月18日 20:24
  • 230

C++中的mutable和const

    声明:这里讨论的const是用来修饰函数的const,而不是用来修饰变量的const。虽然是同一个关键字,但yayv还是觉得把他们当作2个关键字来理解更好一些。    C++中const关键字...
  • yayv
  • yayv
  • 2004年05月10日 12:20
  • 1043

const_cast与mutable

const_cast: 1.作用:用于去除对象的const限定 2.用法:const_cast (expression) //type_id必须是指针或者引用 举例: class Test  ...
  • ly52352148
  • ly52352148
  • 2016年05月22日 15:25
  • 299

const修饰词与指针变量

一、以const修饰词限制指针变量 const放的位置不同,将会产生对指针变量不同的效果。下面来介绍一下。 第一种: const 数据类型 * 指针变量名称 数据类型 const * 指针变量名称 ...
  • hjjdehao
  • hjjdehao
  • 2017年02月23日 21:47
  • 132
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mutable与const修饰词的对称性
举报原因:
原因补充:

(最多只允许输入30个字)