This answerは、C++でラムダ内の変数を移動キャプチャする方法を説明しています。ラムダの移動:移動可能なタイプを移動キャプチャした後、どのようにラムダを使用できますか?
しかし、ラムダ内のコピー不可能なオブジェクト(std::unique_ptr
など)を移動キャプチャした後は、ラムダ自体をコピーすることはできません。
あなたはラムダを移動しますが、そうしようとしたとき、私はコンパイルエラーを取得することができればこれは罰金のようになります。
using namespace std;
class HasCallback
{
public:
void setCallback(std::function<void(void)>&& f)
{
callback = move(f);
}
std::function<void(void)> callback;
};
int main()
{
auto uniq = make_unique<std::string>("Blah blah blah");
HasCallback hc;
hc.setCallback(
[uniq = move(uniq)](void)
{
std::cout << *uniq << std::endl;
});
hc.callback();
}
これはg++
と、次のエラーを生成し(私がコピーしようとしてきました関連する行のみ):
error: use of deleted function ‘main()::<lambda()>::<lambda>(const main()::<lambda()>&’
...ラムダを移動しようとする試みが失敗したと考えています。
clang++
も同様のエラーが発生します。
私は(それは一時的な値だが)ラムダをINGの明示的move
を試してみましたが、それは助けにはなりませんでした。
EDIT:以下の回答は、上記のコードで生成されたコンパイルエラーを適切に解決します。別のアプローチの場合は、単にrelease
のstd::shared_ptr
への一意のポインタの目標値です。はとなります。 (私はこれを答えとして書いていません。なぜなら、これはXYの問題だと思うでしょうが、unique_ptr
がラムダで使用できない理由を理解することが重要です。
EDIT 2:(!)陽気に十分、私はちょうどauto_ptr
が実際にここに正しいことをするだろう、私の知る限り実現。基本的にはunique_ptr
のように動作しますが、move-constructionの代わりにcopy-constructionが可能です。
私は私が間違っている、のsetCallbackが値ではなく、右辺値参照によってパラメータを取得すべきだと思いますか? – Slava
@Slavaそれは私が元々持っていたものですが、同じエラーが発生しました。私はrvalue参照を取ることはラムダが移動構築されることを許可する(/強制する)と思ったが、そうではないようだ。 –