
112
|
3 章 現代の C++ への移行
{ makeLogEntry("Creating StringTable object"); } // added
追加
~StringTable() // also
{ makeLogEntry("Destroying StringTable object"); } // added
これも追加
… // other funcs as before
他の関数は先の例と変わらず
private:
std::map<int, std::string> values; // as before
}; 先の例と変わらず
上例は妥当に見えますが、デストラクタを宣言するとムーブ演算の生成が抑制されるという大き
な副作用が隠れています。一方、コピー演算の生成は影響を受けません。そのため、このコードは
コンパイル、実行に問題がなく、機能テストにもまず合格するでしょう。このクラスはもはやムー
ブ不可能ですが、ムーブ要求はコンパイルおよび実行されており、合格した機能テストにはムーブ
演算も包含されています。しかし、このムーブ要求は、本項目で初めに述べたように、コピー演算
を実行します。すなわち、StringTable オブジェクトをコピーし、また内包する std::map<int,
std::string> オブジェクトをコピーすることで「ムーブ」します。そして、std::map<int, std::
string> のコピーはムーブよりも桁違いに時間がかかり、クラスにデストラクタを追加 ...