C++ 在lambda中调用函数时,ADL失败
我试图从lambda调用一个函数,该函数是在特定成员函数中运行std::for_each的一部分。 示例如下:C++ 在lambda中调用函数时,ADL失败,c++,C++,我试图从lambda调用一个函数,该函数是在特定成员函数中运行std::for_each的一部分。 示例如下: 名称空间A{ 结构Foo{ INTA; int b; }; 无效转储(常量A::Foo&v){ 标准::cout 问题是,在包含lambda调用的作用域中,您已经有一个名为dump()的符号,在这个方法中,它优先 如果将此方法命名为dump2(),则查找将按预期成功 …除了 通常的非限定名称所考虑的作用域和名称空间 查找 “除了通常的非限定名称查找所考虑的作用域和名称空间之外” “
名称空间A{
结构Foo{
INTA;
int b;
};
无效转储(常量A::Foo&v){
标准::cout
问题是,在包含lambda调用的作用域中,您已经有一个名为dump
()的符号,在这个方法中,它优先
如果将此方法命名为dump2()
,则查找将按预期成功
…除了
通常的非限定名称所考虑的作用域和名称空间
查找
“除了通常的非限定名称查找所考虑的作用域和名称空间之外”
“常规”非限定名称查找在调用类中找到dump()
符号。句号。,强调:
设X为非限定查找产生的查找集,Y为参数相关查找产生的查找集(定义如下)。
如果X包含
- 类成员的声明,或
- 不是using声明的块作用域函数声明,或
- 既不是函数也不是函数模板的声明
那么Y是空的。
namespace A {
struct Foo {
int a;
int b;
};
void dump(const A::Foo& v) {
std::cout << v.a << v.b << std::endl;
}
} // ns A
class B {
public:
void dump() const {
(void)std::for_each(std::begin(foo), std::end(foo),
[](const A::Foo &f){
dump(f); // <- fails here, I expected ADL to kick in
});
}
private:
std::vector<A::Foo> foo = { A::Foo{}, A::Foo{} };
};
<source>: In lambda function:
21 : <source>:21:19: error: no matching function for call to
'B::dump(const A::Foo&)'
dump(f);
^
18 : <source>:18:10: note: candidate: void B::dump() const
void dump() const {
void dump() const {