1

周囲のスコープで別の名前空間からの名前がインポートされた場合、一般的なラムダの名前検索規則は何ですか?

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 と intelで異なる結果が得られiccます。gccエラーや警告なしでコンパイルされicc ますが、エラーメッセージが表示されます

error: identifier "bar1" is undefined

行(4)で。https://godbolt.org/g/PYzWtwも参照してください(1) が削除された場合、または (3) で名前空間からの名前nsが再度インポートされた場合、または (2) と (4)autoで置き換えられた場合、状況は変わります。 int. したがって、無関係に見える小さな変更により、コードは .xml でコンパイルされiccます。すべての場合において、それは で問題なくコンパイルされgccます。

これは intels コンパイラのバグですか?

私のコンパイラ設定: gcc 6.3.0, intel icc 18.0.1. また、clang 4 を使用すると、正常にコンパイルされます。

非ジェネリックラムダで動作するため、問題はラムダのインスタンス化ポイントに関連していると思いますoperator()。しかし、どのコンパイラが正しく動作するかわかりません。

4

0 に答える 0