私はラムダをvoid型にキャストして型の削除のために格納する必要がある特別なケースがあります。lambdaをvoid *をキャストして関数ポインタにキャストできないのはなぜですか?
すべてが最初のケースでは動作しますが、2番目のケースでは動作しません。これを解決する方法と、この動作が始まったと定義されている場合もあります。
int main()
{
auto lambda = [](int x){
std::cerr << x << std::endl;
};
//Cast lambda to void*
void* vptr = static_cast<void*>(&lambda);
//Cast vptr back to lambda and call it
(*static_cast<decltype(&lambda)>(vptr))(10); //<--- Ok, compiles and works
//Cast vptr to function pointer
(*static_cast<void(**)(int)>(vptr))(10); //<--- Compiles but segmentation fault
return 0;
}
'void(*)(int)'であってはなりませんか? – songyuanyao
@LightnessRacesinOrbitできません。私は基本的な関数ポインタ、メンバ関数ポインタとlambdasを格納することができるデリゲートクラスを書いています。私はまだそれができるだけ速く、他の方法でやってもうまくいきません。 –
ラムダは関数ではありません。大雑把に言えば、それはファンクタ( 'operator() 'を持つ構造体)です。それを(またはそのアドレス)を関数に変換し、その関数を呼び出すと、未定義の動作が起こります。 – Peter