2017-05-17 10 views
0

Visual Studioのコンパイラ(MSVC 2015)は、次のコードの簡単な作品をコンパイルすることができません:ラムダのラムダはテンプレートではありませんか?

int main() { 
    auto foo = [](auto callback) { 
     callback(int{}); 
    }; 
    auto rexs = [&foo]() { 
     foo([](auto tg) {}); 
    }; 
} 

それは内部コンパイラエラーをbarfs:ときにエラーC1001を与えるのが好き++

fatal error C1001: An internal error has occurred in the compiler. 

VCコンパイルされたコードにはエラーが含まれています(つまり、プログラマが間違いを犯しましたが、VC++はコードの間違いを完全に認識できません)。

しかし、すべての視点から見ると、私のコードは標準に準拠しているように見え、VC++バグのようです。私は正しいと思いますか?

+6

"コンパイラに内部エラーが発生しました。"再現コードが有効かどうかは常にバグ(コンパイラ/ツールチェーン内)です。しかし、コードが有効な場合、バグはより深刻です。 – user2079303

+1

'VC++は、コンパイルされたコードにエラーがある場合(つまり、プログラマーが間違いを犯したが、VC++がコードの間違いを完全に認識しない場合)にエラーC1001を出してしまいます。それが本当であっても、それはまだコンパイラエラーです。もしVSがコードが間違っていると思うなら、それはそれを考える理由があるはずです。 – deviantfan

+0

@ user2079303私は自分のプロジェクトで何度もC1001を見たことがあります。小さな文法の間違いをしても、私のコンパイラをもう叱る気にはなりません。 – Bernard

答えて

2

あなたのコードはclang 3.8とgcc 5.4(http://rextester.com/SCAH69935)で正常にコンパイルされるので、VC++バグのようです。

+1

"C1001"は常にVC++のバグです。 – Donnie

+1

これは、VS 2017オンラインコンパイラで正常にコンパイルするようです。 [This one。](http://webcompiler.cloudapp.net/)アップグレードする時期かもしれません。 – Bernard

-2

VC++が正しい場合:C++ 11ではラムダでautoを使用できません。 ラムダでautoを使用できるのは、C++ 14以降のみです。

クラン3.8.0は私に-std=c++11と、このエラーを与える: main.cppに::(同じフラグ付き)

main.cpp:7:17: error: 'auto' not allowed in lambda parameter 
    auto f = [](auto x) { return x + 1;}; 

とgcc 7.1.0は、私にこの与える関数で「(メインint)を「:

このコードの
main.cpp:7:17: error: use of 'auto' in lambda parameter declaration only available with -std=c++14 or -std=gnu++14 

    auto f = [](auto x) { return x + 1;}; 

int main() 
{ 
    auto f = [](auto x) { return x + 1;}; 
} 
+1

これは「内部コンパイラエラー」を正しくしません。 – Donnie

+0

私のタグが間違っていました。 C++ 14でなければなりません。それを指摘していただきありがとうございます。 – Bernard

+0

trueですが、コードが正しいことを意味するものではありません – nefas

関連する問題