[解決済み] C++11の再帰的ラムダ関数
2022-02-24 23:31:31
質問
C++11の初心者です。 以下の再帰的ラムダ関数を書いているのですが、コンパイルできません。
sum.cpp
#include <iostream>
#include <functional>
auto term = [](int a)->int {
return a*a;
};
auto next = [](int a)->int {
return ++a;
};
auto sum = [term,next,&sum](int a, int b)mutable ->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);
};
int main(){
std::cout<<sum(1,10)<<std::endl;
return 0;
}
コンパイルエラーです。
vimal@linux-718q:~/Study/09C++/c++0x/lambda> g++ -std=c++0x sum.cpp
sum.cpp: ラムダ関数内。
sum.cpp:18:36: エラー: '
((<lambda(int, int)>*)this)-><lambda(int, int)>::sum
' は関数として使用できません
gccバージョン
gcc version 4.5.0 20091231 (experimental) (GCC)
の宣言を変更すると
sum()
のようにすると、動作します。
std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);
};
どなたか、この件に光を当てていただけませんか?
解決方法は?
の違いについて考えてみましょう。 オート バージョンと完全に指定されたタイプバージョンとがあります。 その 自動 キーワードは初期化されたものから型を推定しますが、初期化するものはその型が何であるかを知っている必要があります(この場合、ラムダクロージャはそれが捕捉する型を知っている必要があります)。 鶏と卵の問題のようなものだ。
一方、完全に指定された関数オブジェクトの型は、代入されるものについて何も知る必要がない。したがって、ラムダのクロージャは、同様に、捕捉する型について完全に情報を得ることができる。
あなたのコードを少し修正すると、より理解しやすくなるかもしれません。
std::function<int(int,int)> sum;
sum = [term,next,&sum](int a, int b)->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);
};
当然ながら、これは 自動 . 再帰的ラムダ関数は完全に動作します(少なくとも私が経験したMSVCでは動作します)。ただ、型推論とはあまり相性がよくありません。
関連
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】C++の余分な資格エラー
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] クロージャ」と「ラムダ」の違いは何ですか?
-
[解決済み] Distinct() with lambda?
-
[解決済み] ラムダ(関数)とは何ですか?
-
[解決済み】C++11のラムダ式って何?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】C++の余分な資格エラー
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】Enterキーを押して続行する
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] std::function vs テンプレート