lazy evaluation includes 1) reference counting (to avoid extra
copy) 2) distinguish read from write 3) lazy fetching. 4) lazy
expression evaluation. Detail see in "More Effective C++". Usually,
implementation will be more complex with lazy evaluation.