23
//------------------------------------------------------------------------------
struct A
{
    A(){}
    A(A&&){}
    A& operator=(A&&){return *this;}
    void operator()(){}

private:
    A(const A&);
    A& operator=(const A&);

    int x;
};

//------------------------------------------------------------------------------
int main()
{
    A a;
    std::function<void()> func(std::move(a));
}

'A :: A':クラス'A'で宣言されたプライベートメンバーにアクセスできません

参照によって何かをキャプチャしたりconst、コピーできないラムダを作成したりできるようです。しかし、私がそうするとき、それは実際にそれをに与えるために働きstd::functionます。

4

3 に答える 3

24

簡単に言うと、C ++ 11仕様では、を使用する必要がAありCopyConstructibleますstd::function

長い答えはstd::function、コンストラクター内のファンクターのタイプを消去するため、この要件が存在するということです。これを行うには、std::function仮想関数を介してファンクターの特定のメンバーにアクセスする必要があります。これらには、呼び出し演算子、コピーコンストラクタ、およびデストラクタが含まれます。また、これらは仮想呼び出しを介してアクセスされるため、実際にstd::functionのコピーコンストラクタ、デストラクタ、または呼び出し演算子を使用するかどうかに関係なく「使用」されます。

于 2012-08-01T22:21:34.250 に答える
0

std::functionファンクターはコピー可能である必要があります。

これは任意の設計上の決定です。考えられる代替案は次のとおりです。

  • コピーできないファンクターは許可されますが、結果をコピーしようとするとstd::functionクラッシュ/例外が発生します。
  • コピー不可能なファンクターは許可されており、std::functionそれ自体は常にコピー不可能です。
  • ..。

std::function別のTU(変換ユニット)にコピーできるため、結果をコピーする場合にのみコピー可能性を要求することは不可能です。

ですから、あなたが私に尋ねれば、現在の行動はそれほど悪ではありません。

于 2021-06-20T18:03:24.977 に答える
-3

これはVisualStudioのバグです。コピーを削除しようとします(実際には移動を削除しようとしているはずです)。これには、アクセス可能なコピーコンストラクターが必要です。最善の解決策は、単にコピーコンストラクタ/代入演算子を宣言し、それらを定義しないことです。クラスは引き続きコピーできませんが、VSが実際にコピーコンストラクターを呼び出そうとしないため、コードはコンパイルされます。

于 2012-08-01T22:08:06.907 に答える