在lambda函数中访问周围变量时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在lambda函数中访问周围变量时出错相关的知识,希望对你有一定的参考价值。

...
        unordered_map<string ,int> map;
        for (const auto& str : words) 
            map[str]++;
        
        auto cmp = [map](string s1, string s2)
            if (map[s1] == map[s2])
                return s1 < s2;
            return map[s1] > map[s2];
        ;
...

这给了我no viable overloaded operator[] for type 'const unordered_map<std::__cxx11::string, int>' (aka 'const unordered_map<basic_string<char>, int>')

但是如果我不使用[]运算符,而是使用.at()进行访问。代码会编译。

我不知道为什么。我签出[]运算符和.at():两者具有相同的方法签名。

答案

在lambda中捕获的变量默认为const,除非您将lambda标记为mutableunordered_map没有可以在operator[]对象上调用的const unordered_map,因为如果找不到请求的键,它会插入(即modify

)一个新元素。

此外,您正在捕获map 按值,您应该改为捕获它[[通过引用(除非您期望cmp的寿命超过map)。

尝试一下:

unordered_map<string, int> word_counts; for (const auto& str : words) word_counts[str]++; auto cmp = [&word_counts](const string &word1, const string &word2) auto iter = word_counts.find(word1); int count1 = (iter != word_counts.end()) ? iter->second : 0; iter = word_counts.find(word2); int count2 = (iter != word_counts.end()) ? iter->second : 0; /* or, throw an exception if word1 or word2 are not found... int count1 = word_counts.at(word1); int count2 = word_counts.at(word2); */ if (count1 == count2) return word1 < word2; return count1 > count2; // <-- why > and not < ? ;

另一答案
我签出[]运算符和.at():两者具有相同的方法签名。

没有无法在std::map::operator[] std::map::operator[]上调用const。它可能会修改map(如果指定的键不存在)。 (BTW map不会修改std::map::at,如果指定的键不存在,它将抛出std::map::at。)

您可以用map标记lambda;否则,lambda的std::out_of_range是const限定的,并且通过拷贝捕获的对象也为mutable,那么您将无法对其调用operator()

mutable:允许主体修改通过复制捕获的对象,并调用其非const成员函数

除非在lambda表达式中使用了关键字mutable,否则函数调用运算符是const限定的,并且在此const内部无法修改通过副本捕获的内容。

例如

operator[]


PS:对于变量不使用名称operator()是个好主意。

以上是关于在lambda函数中访问周围变量时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 us-east-1 区域中启动给定的 cloudformation 模板时出错。 (构建 lambda 函数接收错误)

使用 Bref Laravel Lambda 函数从 S3 执行 Listobjects 时出错

将 lambda 函数作为第三个参数传递给 QObject::connect 时出错

使用 terraform 创建 lambda 函数时出错获取验证错误

在 AWS Lambda 函数中运行 Sharp 时出错:darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用

重定向对象列表以使用 lambda 减少函数时出错