イミュータブル
解決法の一つとしてはDecorator パターンでリストの各要素をラップしてしまうというものがある。
C++ではCartをconst-correctな実装にすることで、インスタンスをイミュータブル (const) としてもミュータブルとしても好きなように宣言できる。つまり、2つの異なるgetItems()を提供するのである。
前述のJavaの例ではコンストラクタ引数の参照コピーとしてフィールドに保持していたが、C++ではメンバー変数に格納する時点で複製を行なっている。これはC++にガベージコレクションがないための定石によるものである。メンバー変数m_itemsをポインタ型または参照型にすることもできるが、そうするとコンストラクタ呼び出し元で渡した変数の寿命が尽きた場合に無効なアドレスを指すダングリングポインタまたはダングリング参照となってしまい、管理が煩雑となる。
上記の例では、ミュータブル用のgetItems()はメンバー変数m_itemsへの参照を直接返しており、この参照経由でオブジェクトの状態を変更することができる。メンバー変数m_itemsがすでに複製であることから、イミュータブル用のgetItems() constの内容は戻り値の型にconstを加えるだけでよい。const修飾されたオブジェクトからはconst修飾されたメンバーにしかアクセスできないため、破壊的な操作はできなくなる。