2017-01-20 15 views
1

私は宿題にラムダを使用しています。私が見てきたことは、匿名でカプセル化された種類の関数です。私はmax()のような与えられた2つの値の最大値を単純に返す小さなテストを行いました。ラムダを使用しても変換エラーが発生します

double testx, testy = 0.0; 
// Give the above some values 
double maxi = [testx, testy]() {return (testx > testy ? testx : testy); }; 

このラムダをコンパイルするたびに、ビルドエラーが発生します。 (コードC2440)

からのNOの適切な変換関数は、 "ラムダ[]ダブル() - >ダブル" 私はこの例よりも試みた

に "ダブル" は存在し、それぞれがすべき上記のエラーでそれぞれの戻り値の型で作成されます。彼らの目的のためにラムダを避ける答えを与えられたVisual Studioの以前のバージョンで私と同じエラーが与えられたように見えるrelated questionがあります。

答えて

1

ラムダ式自体をdouble型の変数に代入しようとしているため、このエラーが発生します。コンパイラのエラーはそれだけを示しています。あなたがすぐにでき、また

double res = l(); 

auto l = [testx, testy]() {return (testx > testy ? testx : testy); }; 

または

std::function<double()> l = [testx, testy]() {return (testx > testy ? testx : testy); }; 

して、呼び出しの結果を割り当てる:何がすべきことは、それを保持することができます変数にラムダを割り当てるですラムダを呼び出す:

double maxi = ([testx, testy]() {return (testx > testy ? testx : testy); })(); 
  • 余分な括弧に注意してください。
+0

余分な括弧はどのように機能を追加しますか? – BreakinDragon

+0

これは2段階のアクションです。最初にラムダオブジェクトを作成し、すぐに呼び出すことができます(ラムダ自体をラップする括弧を省略し、最後のペアだけを残してもかまいませんが、これは少しはっきりしていると思います)。これはC++でlambdaを使用する一般的な方法ではなく、すべての構文オプションを示すためにのみ表示されていることに注意してください。 – eran

関連する問題