5

戻り値の型として unique_ptr を使用すると、コンパイラ エラー C2280 が表示されます。

'caf::detail::tuple_vals<std::unique_ptr<A,std::default_delete<_Ty>>>::tuple_vals(const caf::detail::tuple_vals<std::unique_ptr<_Ty,std::default_delete<_Ty>>> &)': attempting to reference a deleted function  include\caf\detail\tuple_vals.hpp   102

この問題を示すサンプル コードを次に示します (C++ Actor Framework の例の 1 つから変更されています)。

#include <iostream>
#include "caf/all.hpp"

using namespace caf;
using namespace std;

class A
{
public:
    int a;

    A(int a)
    {
        this->a = a;
    }
};

using a_type = typed_actor<replies_to<int>::with<unique_ptr<A>>>;

a_type::behavior_type a_behavior(a_type::pointer self)
{
    return
    {
        [self](const int& a) -> unique_ptr<A>
        {
            return make_unique<A>(5);
        }
    };
}

void tester(event_based_actor* self, const a_type& testee)
{
    self->link_to(testee);
    // will be invoked if we receive an unexpected response message
    self->on_sync_failure(
        [=]
        {
            aout(self) << "AUT (actor under test) failed" << endl;
            self->quit(exit_reason::user_shutdown);
        });
    self->sync_send(testee, 5).then(
        [=](unique_ptr<A> a)
        {
            if(a->a == 5)
            {
                aout(self) << "AUT success" << endl;
            }

            self->send_exit(testee, exit_reason::user_shutdown);
        }
    );
}
4

2 に答える 2

5

CAF では、メッセージの各タイプが正規である必要があります。これstd::unique_ptrは、持っていないコピー コンストラクターを提供する必要があることを意味します。したがって、コンパイラは不平を言います。

メッセージにはコピー オン ライトの実装があります。内部的に参照カウントを増やすだけなので、単一のメッセージを安価にコピーできます。いつでも、メッセージ要素の const アクセスを実行できます。コピー オン ライトの「書き込み」部分は、メッセージの参照カウントが 1 よりも大きく、非定数アクセスを要求した場合にのみ開始されます。その時点で、ランタイムは、含まれている型のコピー コンストラクターを呼び出して、新しいメッセージを作成します。

CAF が参照カウントに関係なく無条件にこのコピーを実行する場合、アクターがメッセージを受信し、その内容を変更して次の段階に進むデータ フロー プログラミングを効率的にサポートすることはできません。

メッセージをポインター コンテナーと考え​​てください。含まれている要素はフリー ストアに割り当てられます。メッセージにポインターを格納することは、通常、設計上の欠陥です。また、二重ラップは、アロケーターに不必要なストレスを与えます。

メッセージを柔軟にスライスできるため、単一のメッセージを作成するだけで済み、そこに含まれる値をさまざまなコンテキストで使用できます。

于 2015-11-12T02:38:49.137 に答える
2

はい、C++ アクター フレームワークでは、返信メッセージでスマート ポインターを使用できますが、unique_ptr.

C++ アクター フレームワークの実装は現在、メッセージのコピーを作成し、 を逆参照するためunique_ptr、コンパイラ エラーが発生します。

を使用する代わりに、代わりに使用しunique_ptrshared_ptrください。質問のサンプル コードを変更すると、参照カウントは 2 になります。また、カスタムの削除関数を使用して、2 番目のshare_ptr.

于 2015-11-10T21:44:21.903 に答える