C++ Visual Studio 错误 : Identifier cannot be implicitly captured because no default capture mode has been specified

标签 c++ visual-studio lambda path filesystems

我正在尝试提取此代码中 dir_entry.path() 的值并想将其复制到 compFileName 中。 问题是我一直收到错误“compFileName cannot be implicitly capture because no default capture mode have been specified”。

我知道它与 lambda 函数有关,但我对它们的经验为零。 关于我应该如何解决这个问题以实现我想要的,有什么建议吗?

#include <filesystem>
#include <algorithm>

namespace fs = std::filesystem;

void search(const fs::path& directory, const fs::path& file_name, string &compFileName)
{
    auto d = fs::recursive_directory_iterator(directory);

    auto found = std::find_if(d, end(d), [&file_name](const auto & dir_entry)
    {
        string t = dir_entry.path().filename().string();
        compFileName = t;
        return t == file_name;
    );

}

最佳答案

除非捕获它们,否则不能在 lambda 中使用周围变量。

您使用在周围范围内定义的 compFileName,但它没有列为捕获。

简单修复:将 &compFileName 添加到您的捕获列表:

[&file_name, &compFileName](const auto & dir_entry) { ... }

更简单:捕获所有使用的变量:

[&](const auto & dir_entry) { ... }

关于C++ Visual Studio 错误 : Identifier cannot be implicitly captured because no default capture mode has been specified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51401689/

相关文章:

c++ - 如何在 C++ 中使用 winapi 事件解决生产者-消费者问题?

循环中的 C++ 模迭代器

c# - 如何在适用于 Android 和 iOS 的 Xamarin 跨平台应用程序中的应用程序图标上显示角标(Badge)计数

c# - 有什么方法可以将 .dll 文件转换为 .cs 文件

visual-studio - VS 2010 中每个缩进处的虚线

java - 如何使用 Java 8 流将列表元素映射到它们的索引?

swift - Swift 中闭包表达式的等效性,例如 SKAction 完成

linq - LINQ Lambda Join错误-无法从使用情况推断出

c++ - 通过套接字发送数据不起作用

c++ - 在 C++ 中模拟 CLOS :before, :after, 和 :around