Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从lambda调用函数时,查找规则是什么?_C++_C++11 - Fatal编程技术网

C++ 从lambda调用函数时,查找规则是什么?

C++ 从lambda调用函数时,查找规则是什么?,c++,c++11,C++,C++11,以下示例演示了我在VC++2010中遇到的问题: class-Foo { 模板 静态T foo(T){return T;} 公众: 无效测试() { 自动lambda=[](){return foo(1);};//调用foo::foo lambda(); } }; VC++生成:错误C3861:'foo':找不到标识符 如果我限定对foo的调用:foo::foo(1)然后此示例编译时会显示一条警告: 警告C4573:使用'Foo::Foo'要求编译器捕获'this',但当前默认捕获模式不允许它

以下示例演示了我在VC++2010中遇到的问题:

class-Foo
{
模板
静态T foo(T){return T;}
公众:
无效测试()
{
自动lambda=[](){return foo(1);};//调用foo::foo
lambda();
}
};
VC++生成:错误C3861:
'foo'
:找不到标识符

如果我限定对foo的调用:
foo::foo(1)然后此示例编译时会显示一条警告:
警告C4573:使用
'Foo::Foo'
要求编译器捕获
'this'
,但当前默认捕获模式不允许它


该标准对该案例有何规定?是否应找到不合格的名称?限定名称是否需要捕获此

以下编译很好。在我看来,这一定是一个带有模板的VS错误

struct Foo {
    static void foo() {}
    void bar() {
        auto f = []() { foo(); };
        f();
    }
};

微软已经在许多案例中发现了这个问题。见:


正如您所发现的,显式解析允许它查找名称。关于这一点还有一个额外的警告,这也是一个编译器错误(名称解析不需要访问它,尽管我可以看到编译器实现可能需要它)——但这是一个单独的错误。微软已经确认这是一个bug,并且显然已经为下一个版本准备了一个补丁。

Hm,这很奇怪。它是静态的,所以它不需要
这个
。我怀疑这是编译器的错误,没有找到它是编译器认为需要
this
来使用它的副作用。这也发生在g++上,所以看起来不像是一个错误。如果你把它改为[&](),而不是[](),那么这个编译就可以了,但那是因为它引用了this,这说明它是一个bug。你试过什么编译器?结果似乎因编译器而异,因此了解标准一致性行为很重要。@Gene:VC++2010实现了lambdas pre-,因此不符合FDIS的措辞。