問題提出:
在研究和借鑑 emacs lisp 實現程序時, 有部分值被定義爲 volatile 的, 則對其取值和賦值都有些不一樣,
在 C++ 中. 對象
例子:
struct Lisp_Object { int i; }; // 這是 lisp 基本對象結構定義. get
volatile Lisp_Object var, var2; // 某些地方必須使用 volatile 的變量.
Lisp_Object arg; // 大部分是普通變量.
// 如下取值/賦值產生編譯器錯誤.
arg = var; // 編譯器錯誤 C2678: 二進制「=」: 沒有找到接受「volatile Lisp_Object」類型的左操做數的運算符(或沒有可接受的轉換)
var = arg; // C2679: 沒有找到接受「volatile Lisp_Object」類型的右操做數的運算符(或沒有可接受的轉換)
var = var2; // C2678: 這樣也錯..., 實在很麻煩... 編譯器
解決的方法: emacs
arg = const_cast<const Lisp_Object &>(var);
const_cast<Lisp_Object &>(var) = arg;
const_cast<Lisp_Object &>(var) = const_cast<const Lisp_Object &)(var2); io
最後的那個寫起來很麻煩, 真用起來通常用宏包裝起來... 編譯