93134


### 質問内容

提示コードですが以下のコードで関すポインタ変数に匿名関数を代入したいのですがどの実装もエラーになります。  
戻り値を取る場合の匿名関数はどうやって定義するのでしょうか？

### 知りたいこと

関数ポインタ変数に戻り値取る匿名関数を代入する方法が知りたい

### 試したこと、知りたいこと

提示コードの`//実装`部のよにいろいろ試しましたがどれもエラーになりどれが一番正解の近い形なのかわかりません。

### 参考サイト

Quiita: <https://qiita.com/YukiMiyatake/items/8d10bca26246f4f7a9c8>  
ブログサイトA： https://marycore.jp/prog/cpp/pass-function-as-argument/  
ブログサイトB：
https://kaworu.jpn.org/cpp/%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F#.E6.9C.80.E5.B0.8F.E3.81.AE.E3.83.A9.E3.83.A0.E3.83.80.E5.BC.8F.E3.81.AE.E5.AE.9A.E7.BE.A9

### ソースコード

[code]

    #include <iostream>
    
    
    int call() 
    {
        return 1;
    }
    
    
    
    //int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; return 0; }();    //実装１
    //int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; return 0; }(int); //実装2
    //int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; }(0);             //実装3
    int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; }(return 0);        //実装4
    
    
    
    //int(*f)() = call;
    
    
    int main()
    {       
        //std::cout<<call(fn)<<std::endl;
        
        return 0;
    }
    
    
[/code]

### エラー

##### 実装１ Error

[code]

    $ make
    g++ -c -MMD -MP src/Main.cpp -o obj/Main.o -I./../src -I ~/Library -I ~/Library/freetype 
    src/Main.cpp:21:68: error: invalid conversion from ‘int’ to ‘int (*)()’ [-fpermissive]
       21 | int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; return 0; }();
          |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
          |                                                                    |
          |                                                                    int
    make: *** [Makefile:15: obj/Main.o] エラー 1
    
[/code]

#### 実装２ Error

[code]

    $ make
    g++ -c -MMD -MP src/Main.cpp -o obj/Main.o -I./../src -I ~/Library -I ~/Library/freetype 
    src/Main.cpp:22:69: error: expected primary-expression before ‘int’
       22 | int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; return 0; }(int);  //実装2
          |                                                                     ^~~
    make: *** [Makefile:15: obj/Main.o] エラー 1
    
    
[/code]

### 実装３ Error

[code]

    $ make
    g++ -c -MMD -MP src/Main.cpp -o obj/Main.o -I./../src -I ~/Library -I ~/Library/freetype 
    src/Main.cpp: In lambda function:
    src/Main.cpp:23:57: warning: no return statement in function returning non-void [-Wreturn-type]
       23 | int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; }(0);  //実装3
          |                                                         ^
    src/Main.cpp: At global scope:
    src/Main.cpp:23:60: error: no match for call to ‘(<lambda()>) (int)’
       23 | int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; }(0);  //実装3
          |                                                            ^
    src/Main.cpp:23:60: note: candidate: ‘int (*)()’ <conversion>
    src/Main.cpp:23:60: note:   candidate expects 1 argument, 2 provided
    src/Main.cpp:23:13: note: candidate: ‘<lambda()>’
       23 | int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; }(0);  //実装3
          |             ^
    src/Main.cpp:23:13: note:   candidate expects 0 arguments, 1 provided
    make: *** [Makefile:15: obj/Main.o] エラー 1
    
    
[/code]

### 実装4 Error

[code]

     make
    g++ -c -MMD -MP src/Main.cpp -o obj/Main.o -I./../src -I ~/Library -I ~/Library/freetype 
    src/Main.cpp: In lambda function:
    src/Main.cpp:24:57: warning: no return statement in function returning non-void [-Wreturn-type]
       24 | int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; }(return 0);             //実装4
          |                                                         ^
    src/Main.cpp: At global scope:
    src/Main.cpp:24:59: error: expected primary-expression before ‘return’
       24 | int(*f)() = []() -> int { std::cout<<"ssss"<<std::endl; }(return 0);             //実装4
          |                                                           ^~~~~~
    make: *** [Makefile:15: obj/Main.o] エラー 1
    
    
[/code]


CC BY-SA 4.0
2023-01-01T03:40:29.890
93133
2023-01-01T05:13:17.197
55177
question
c++
C++ 関数ポインタ変数に戻り値を取る匿名関数を代入する方法


[ラムダ式の構文](https://cpprefjp.github.io/lang/cpp11/lambda_expressions.html#syntax)は、属性などの指定を省略すると下記になります。

`[キャプチャリスト](パラメータリスト) -> 戻り値の型 { 関数の本体 }`

その後ろの`(引数)`を置けば、そのラムダ式を呼び出すことになります。

関数ポインターに代入するのであれば、`(引数)`は不要です。


CC BY-SA 4.0
2023-01-01T05:13:17.197
93134
2023-01-01T05:13:17.197
9113
93133
answer