2015-12-14 8 views
7
voidポインタに関数ポインタを割り当てる

voidポインタがラムダ関数を指すことはできますか?この<a href="https://isocpp.org/wiki/faq/pointers-to-members#cant-cvt-fnptr-to-voidptr" rel="nofollow">FAQ</a>で説明したように

double f_dummy(double x) { return x; } 
... 
    void *pv = f_dummy; //compilation error 

は違法です。しかし、答えは以下の文で終わります。

特定のオペレーティングシステム上の特定のコンパイラの特定のバージョンで動作していると思われる場合は、私に電子メールを送信しないでください。私は気にしない。期間は違法です。

編集:他の人への警告として、私はこのクラステンプレートを含む継承の場合を通じて、振る舞い「を動作するようです」出会いました。コンパイラの警告も予期しない実行時の動作もありません。

これは

コンパイルし、きれいに( g++ -std=c++11 -Wall)を実行
... 
    auto l_func = [](double x){ return f_dummy(x); }; 
    void *pv = &l_func; 
    auto pl = static_cast<decltype(&l_func)>(pv); 
    cout << (*pl)(5.) << endl; 

、本当に合法である、例えば、私のOCDの骨をくすぐる、私が何をしてきたなら、私は思ってしまいます。それは...ですか?

+3

'l_func'は関数ではありません。それはオブジェクトです。 –

答えて

15

のではい、それは、法的です:オブジェクトへのポインタが再びvoid*とバックにキャストすることができる

  • l_funcは、ラムダの実装方法であるオブジェクト(ファンクタ、不特定のクラスタイプ)—です。

あなたがよく尋ねるFAQテキストは、ファンクションへのポインタを参照しているため、無関係です。 _yourUnspecifiedLambdaType::operator()は同等の機能ですが、ここでは何もしません。まあ

*それはメンバー機能だから、それは、でも同等ではありません!

+0

偉大な(そして簡潔な)答えに加えて、1つ!偉大な帽子も;))このタイプの消去は全然無意味ですが、できるだけ早く消えるべきです。私はC++をHaskellに変換しようとはしていませんが、真剣に考えてみましょう。 'void * 'なしで完全に合理的なプログラミングを行うことができます。演算子 'new'のオーバーロードは、(0.01%のように)実行しなければならないとき以外は実際には起こりません。 – vsoftco

+1

@vsoftco:すべての(すべて!)カウントに同意しました; p –

+0

私の歯はm ... f..rのように痛いですが、私はまだchillaxxをしようとしています。歯科医、金、前にアドバイスを?アルコールはうまくいきません:( – vsoftco

関連する問題

 関連する問題