meryngii.neta

今日も新たな"ネタ"を求めて。

volatileなオブジェクトのコピー(再び)

以前volatileとコピー・代入 - meryngii.netaということでvolatileにまつわるCとC++の非互換性について書いたのだが、C++仕様書の最後で丸々このことが触れられていることに気づいた。せっかくなので拙訳を用意した。

付録C.1.8 12項. 特別なメンバ関数
12.8 (クラスオブジェクトのコピー)
 
変更点: volatileなオブジェクトのコピー
 
暗黙に定義されたコピーコンストラクタと暗黙に定義されたコピー代入演算子はvolatileな左辺値を作ることができない。例えば、次の例はISO Cでは合法である:
 
struct X { int i; };
struct X x1, x2;
volatile struct X x3 = {0};
x1 = x3; // C++では不正
x2 = x3; // これもまたC++では不正
 
論拠: いくつかの対案が長い間討論された。引数をvolatile const X&に変えると、クラスオブジェクトについて高速なコードを生成するのが非常に難しくなるだろう。暗黙に定義された演算子ごとに2つの別々のシグネチャを用意することについての議論は、曖昧性を生んだり、ベースクラスとメンバによるこれらの演算子の形成について明らかにするルールを複雑にしたりすることについてうやむやな問題を引き起こした。
 
元の機能への影響: 正しい意味を持つ機能の削除。
 
変換の難しさ: 意味上の転送。もしコピーにvolatileの意味が要求されるなら、ユーザ定義のコンストラクタか代入が用意されなければならない。もしvolatileの意味が要求されないなら、明示的なconst_castが使える。
 
どのくらい広く使われるか: ほとんど使われない。

大して使われないのにデフォルトの演算子を増やして複雑にするわけにはいかなかったということのようだ。確かにこれ以上C++に暗黙の動作を増やしたらどうなるかを考えると納得がいく。