あなたの問題は、要素がコピー不可能であり、であるということですconst
。const XYZ
要素はメンバーとして動作しますconst XYZ
。5.2.5p4までに、xvalueの要素にアクセスするconst XYZ
と、ユニオンcv修飾を持つxvalueが生成されます。つまり、有効なタイプがありconst XYZ &&
ます。この型はのmoveコンストラクターへの引数としては適していないXYZ
ため、代わりにdeleted /privatecopyコンストラクターが呼び出されます。
別の見方をすれば、moveコンストラクター(たとえば、のmoveコンストラクターstd::tuple<...>
)は、引数が指定されていないが有効な状態のままであることを確認する必要があります。要素を作成することにより、その要素const
の唯一の有効な状態はそれが構築された状態であると述べたため、xvalueに含まれている場合でも、moveコンストラクターはその要素から移動できません。
回避策は、 const moveコンストラクターとconst_cast
、moveコンストラクターに委任する引数を定義することです。
XYZ(const XYZ &&xyz): XYZ(const_cast<XYZ &&>(xyz)) {}
面白いことに、gcc-4.7.2では、constmoveコンストラクターを宣言するだけで十分です。RVOにより、constmoveコンストラクターへの実際の呼び出しを省略できます。これに頼らないでください。