对 volatile 的对象取值和赋值 (几何画板开发笔记 二)

问题提出:
   在研究和借鉴 emacs lisp 实现程序时, 有部分值被定义为 volatile 的, 则对其取值和赋值都有些不同,
在 C++ 中.

例子:
   struct Lisp_Object { int i; };   // 这是 lisp 基本对象结构定义.

   volatile Lisp_Object var, var2;   // 某些地方必须使用 volatile 的变量.
   Lisp_Object arg;       // 大部分是普通变量.
   // 以下取值/赋值产生编译器错误.
   arg = var;   // 编译器错误 C2678: 二进制“=”: 没有找到接受“volatile Lisp_Object”类型的左操作数的运算符(或没有可接受的转换)
   var = arg;   // C2679: 没有找到接受“volatile Lisp_Object”类型的右操作数的运算符(或没有可接受的转换)
   var = var2;   // C2678: 这样也错..., 实在很麻烦...

 

解决的方法:

    arg = const_cast<const Lisp_Object &>(var);
    const_cast<Lisp_Object &>(var) = arg;
    const_cast<Lisp_Object &>(var) = const_cast<const Lisp_Object &)(var2); 

最后的那个写起来很麻烦, 真用起来一般用宏包装起来...

 

参见:
http://stackoverflow.com/questions/4644296/cant-assign-an-object-to-a-volatile-object/23441800#23441800

 

你可能感兴趣的:(C++)