英特尔icc

时间:2018-01-07 21:57:38

标签: c++ c++14 icc name-lookup generic-lambda

如果在周围范围内导入了来自不同命名空间的名称,那么通用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的实例化点有关。但我不知道哪个编译器正确执行。

0 个答案:

没有答案