如果在周围范围内导入了来自不同命名空间的名称,那么通用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
和英特尔icc
中产生不同的结果。在gcc
中编译时没有错误和警告,在icc
中我收到错误消息
error: identifier "bar1" is undefined
第(4)行中的。另请参阅https://godbolt.org/g/PYzWtw如果(1)被删除,或者如果在(3)中再次导入名称空间ns
中的名称,或者如果在(2)和(4)中{{1} }被auto
取代。因此,似乎无关紧要的小变化使代码在int
中编译。在所有情况下,它与icc
编译良好。
这是intels编译器中的错误吗?
我的编译器设置:gcc 6.3.0,intel icc 18.0.1。对于clang 4,它编译得很好。
由于它适用于非泛型lambda,我假设,问题与lambda gcc
的实例化点有关。但我不知道哪个编译器正确执行。