にゃははー

はへらー

copy/move-ctorやcopy/move-assignmentの認識

誤った解説は誤った認識を無駄に広げる。


他人は知りませんが、私はやられた口です。

あるクラスXについて

/*1*/ X::X( const X & );
/*2*/ X::X( X &, int = 0 );
/*3*/ X::X( const X &, int );
/*4*/ X::X( const volatile X & );
/*5*/ X::X( X );
/*6*/ X::X( int, const X & );

のうち、copy-ctorで無いものはどれでしょうか。

よく訓練されたC++erならわかることでしょう。
正解は3と5と6です。もっというと5はill-formedです。2も定義する場所によってill-formedになります。
これらの詳細は仕様を読んでください。

よく(入門サイトなどの)各所で見かけるcopy-ctorの説明に

copy constructorは
X::X( const X & )
です。

というのを見かける。

逆に上の1,2,4みたいなのを挙げてこれもcopy-ctorですと言っているところは、まず私の知っている限り無い。
実はこんなことを書いている私もさっき(リアルにさっき)までそうだとは知らなかった。
初めてのauto_ptrを見たときにそのコンストラクタに疑問を持ったが、流石人間の形をしているだけある。人の形をしているものならimplicitly definedされるスルー力で光の速さで見なかったことにした。

同様にmove-ctorも第1引数がrvalue-refであれば、copy/move-assignmentも1引数であればcopy-ctorの様にcv-qualifierはどうでもいい問題だ。
copy/move-ctorに限って言えば更に第2引数以降全てにデフォルト引数が与えられていれば引数の数は問題ではない。

hito_hppさんがC++0xの詳細な解説本を出すらしいが、なぜ今までこういった本が出なかったのか。
いや、私が知らなすぎるだけなんだろうが、それにしてもそういった話を聞かない。
確かに出そうと思ったら、仕様書を完全に翻訳する以上のことを要求されるわけだからそれは誰もやりたがらない。

やはりネックは翻訳。 英語怖い