1

如果在周围范围内导入来自不同命名空间的名称,则通用 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()。但我不知道哪个编译器正确执行。

4

0 回答 0