周囲のスコープで別の名前空間からの名前がインポートされた場合、一般的なラムダの名前検索規則は何ですか?
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()
。しかし、どのコンパイラが正しく動作するかわかりません。