C++ 11/g ++:lambda中需要std :: qualifier,尽管给出了"using namespace std"

Pio*_*r99 7 c++ lambda g++ c++11

我试图发现新的C++ 11标准的一些好处(使用g ++ 4.6.2).在一个"all_of"算法函数中使用lambdas,我遇到了std :: qualifier的一个奇怪问题.

我正在"使用"std命名空间,如代码片段的开头所示.这使得for循环中的变量声明定义明确.

但是,我在"all_of"算法中使用的lambda参数中尝试了相同的操作.在我意识到完整的std :: qualified std :: pair可以在那里工作之前,我遇到了几个难以理解的错误消息,但只有一对没有.

我错过了一个重点吗?lambda的声明发生在这个文件中,所以命名空间在这里仍然应该是活动的,对吧?或者所需的std :: qualifier是否依赖于不同文件中的某些STL代码?或者它可能是g ++中的错误?

最好的问候,彼得

PS:代码编译没有警告粘贴在这里,但删除all_of lambda中的std ::,我收到一条错误消息.

#include <iostream>
#include <memory>
#include <map>
#include <string>
#include <algorithm>
#include <utility>

using namespace std;

void duckburg() {

const int threshold = 100;
map <string, int> money;

money["donald"] = 200;
money["daisy"] = 400;
money["scrooge"] = 2000000;

// obviously, an "auto" type would work here nicely,
// but this way my problem is illustrated more clearly:

for (const pair <string, int> &pair : money) {
    cout << pair.first << "\t" << pair.second << endl;
}

if (all_of(money.begin(), money.end(),
    [&](std::pair<string, int> p) {
    return bool(p.second > threshold);
})) 
{
    cout << "yes, everyone is rich!";
} else {
    cout << "no, some are poor!";
};
}
Run Code Online (Sandbox Code Playgroud)

编辑:刚刚注意到我收到了这个旧问题的downvote.没问题,但请详细说明原因.它将帮助我改进未来的问题,最终整个社区将获利.谢谢!

wol*_*ang 8

pair在for循环中重命名变量.

它的范围只延伸到结束for循环,因此不会与你的拉姆达干扰,但G ++有古代的,作用域规则在那里,这是不是这样的一些代码,所以它可以发出古C++代码更好的错误信息.

看起来该兼容性代码中存在错误.