如果在周围范围内导入来自不同命名空间的名称,则通用 lambda 中的名称查找规则是什么?
namespace ns
{
template <class F>
void bar2(F f) { f(0); }
template <class F>
void bar1(F f)
{
bar2(f); // (1)
}
}
void foo()
{
using namespace ns;
bar1([&](auto i) { // (2)
// using namespace ns; // (3)
bar1([&](auto j) {}); // (4)
});
}
int main()
{
foo();
}
上述情况在gcc
和 intel中给出了不同的结果icc
。虽然gcc
它编译时没有错误和警告,但icc
我收到错误消息
error: identifier "bar1" is undefined
在第 (4) 行。另见https://godbolt.org/g/PYzWtw如果 (1) 被删除,或者如果在 (3)ns
中再次导入命名空间中的名称,或者如果在 (2) 和 (4)auto
中被替换为int
. 因此,看似无关紧要的小改动会使代码编译为icc
. 在所有情况下,它都可以与gcc
.
这是英特尔编译器中的错误吗?
我的编译器设置:gcc 6.3.0,intel icc 18.0.1。还有clang 4它编译得很好。
由于它适用于非泛型 lambda,因此我认为问题与 lambda 的实例化点有关operator()
。但我不知道哪个编译器正确执行。