1. ホーム
  2. c++

エラー: "デフォルトのキャプチャモードが指定されていないため、暗黙的にキャプチャできない" という変数があります。

2023-08-31 13:26:17

質問

私は この例 でラムダを使用する remove_if . 以下は私の試みです。

int flagId = _ChildToRemove->getId();
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(), 
        [](Flag& device) { 
            return device.getId() == flagId; 
        });

m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end());

と記述しますが、これはコンパイルに失敗します。

error C3493: 'flagId' cannot be implicitly captured because no default capture mode has been specified

外部パラメータを含めるにはどうしたらよいでしょうか。 flagId をラムダ式に含めることができますか?

どのように解決するのですか?

を指定する必要があります。 flagId を指定するとキャプチャされます。それが、この [] の部分はそのためのものです。今は何もキャプチャされません。キャプチャできるのは ( 詳細情報 ) を値または参照によってキャプチャすることができます。こんな感じ。

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [&flagId](Flag& device)
    { return device.getId() == flagId; });

これは参照でキャプチャするものです。const値でキャプチャしたい場合は、このようにします。

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [flagId](Flag& device)
    { return device.getId() == flagId; });

あるいはミュータブルな値で

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [flagId](Flag& device) mutable
    { return device.getId() == flagId; });

残念ながら const 参照でキャプチャする直接的な方法は C++17 まで存在しません。 私個人としては、一時的な const を宣言し、それを参照で捕捉します。

const auto& tmp = flagId;
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
            [&tmp](Flag& device)
        { return device.getId() == tmp; }); //tmp is immutable

C++17以降では、const-referenceでキャプチャするために as_const

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
            [&flagId = std::as_const(flagId)](Flag& device)
        { return device.getId() == flagId; });