テンプレート関数で他のラムダから空の(キャプチャレス)ラムダを識別する方法を探しています。現在C ++ 17を使用していますが、C ++ 20の回答にも興味があります。
私のコードは次のようになります:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
C ++標準(17または20)で、関数ポインターに変換可能なキャプチャレスラムダでもstd::is_empty
歩留まりがtrueになることが保証されていますか?
例としてこのコードを見てください:
auto a = []{}; // captureless
auto b = [c = 'z']{}; // has captures
static_assert(sizeof(a) == sizeof(b)); // Both are the same size
static_assert(!std::is_empty_v<decltype(b)>); // It has a `c` member
static_assert(std::is_empty_v<decltype(a)>); // Passes. It is guaranteed?
@HolyBlackCat私はそれについて考えましたが、私の知る限り、MSVCは変換演算子をオーバーロードしているのでそれを許可しません。
—
ギヨームラシコット
@GuillaumeRacicot MSは、利用可能なすべての呼び出し規約に対して個別の変換演算子を公開します。1つを選択して、ラムダを同等の関数ポインターに変換し、それが成功するか失敗するかを確認してください。
—
レミールボー
+lambda
)への変換が整形式かどうかを確認できます。