私はHow do I write a lambda expression that looks like a method?と答えているが、C++ 17以来、キャプチャレスラムダはconstexpr変換演算子を関数ポインタ型に持っているという事実を利用して、キャプチャレスラムダをメンバ関数ポインタに変えようとした。C++ 17のキャプチャレスラムダconstexpr変換演算子の結果を、関数ポインタテンプレート型以外の引数として使用できますか?
だから私はまで沸騰問題を思い付いた:
今template<void(*)()> struct A{};
int main()
{
A<static_cast<void(*)()>([]{})>{}; // 1
constexpr auto fp = static_cast<void(*)()>([]{});
A<fp>{}; // 2
}
、これは(5.0.0以降)打ち鳴らすにコンパイルしますが、GCC(> = 7.2)が文句:
error: lambda-expression in template-argument
A<static_cast<void(*)()>([]{ /*whatever*/ })>{}; // 1
^
error: 'main()::<lambda()>::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::<lambda()>::_FUN()' has no linkage
A<fp>{}; // 2
質問は、ですね。
constexprローカル変数を使用した簡単な例が存在するはずです。 – Yakk
@ヤク、完了。これは元のコードと全く同じではありません。 –
私はあなたが何を正確にしようとしているのか、なぜこれが必要なのか不思議に思うのを助けることはできません。 –