在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标记为mutable
。 unordered_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' 平台上使用