web-dev-qa-db-ja.com

エラー:変数「デフォルトのキャプチャモードが指定されていないため、暗黙的にキャプチャできません」

私は この例 に従ってラムダを使用しようとしています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を含めるにはどうすればよいですか?

44
user63898

キャプチャする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参照によってキャプチャする簡単な方法はありません。私は個人的に一時的なconst refを宣言し、それをrefでキャプチャします。

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
80
AndyG