✨

c++でlambdaを関数ポインタに直す最小の方法

に公開

TL;DR

単項演算子+で変換

#include <iostream>
#include <type_traits>
int main()
{
    auto funcPtr = +[] {};
    static_assert(std::is_same<decltype(funcPtr), void (*)()>::value);
}

なぜこれがうまく動くか?

最初はlambdaの特殊仕様かと思ったがそうではないらしい。[1]

キャプチャのないlambda式の評価値であるラムダオブジェクトには関数ポインタへの暗黙の変換演算子が定義される。そこで、単項演算子+がつくとラムダオブジェクトとしては解釈不能になり、暗黙の型変換が試行される。その候補先で唯一整合的なのが関数ポインタなので関数ポインタへと暗黙の型変換される。+はポインタ型にとっては何もしない演算子なので、そのままの関数ポインタ値が返る。という理屈らしい。(コメント欄で訂正いただきました。ありがとうございます。)

追伸

ちなみに、これはChatGPT 5に自分の書いたコードをかっこよくしてもらう過程で教えてもらった書き方。AIは知識の玉手箱だね。

参考

脚注
  1. StackOverflowでのわかりやすい説明 ↩︎

Discussion