4

std::tuple<const XYZ,...>XYZがコピーできない場所を作成する必要があります。そのようなことさえ可能ですか?私の現在のコード

auto test() -> std::tuple<const XYZ> { return std::make_tuple(XYZ()); }

Visual Studio 2010のC2248につながります...R値を使用してタプルを構築しているので、かなり疑わしいと思います。したがって、move-constructionが開始されると思います...

4

1 に答える 1

3

あなたの問題は、要素がコピー不可能であり、であるということですconstconst 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コンストラクターへの実際の呼び出しを省略できます。これに頼らないでください。

于 2012-10-05T18:18:52.600 に答える