问题提出:
在研究和借鉴 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);
最后的那个写起来很麻烦, 真用起来一般用宏包装起来...