2017-12-02 5 views
9

私は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 

質問は、ですね。

+1

constexprローカル変数を使用した簡単な例が存在するはずです。 – Yakk

+0

@ヤク、完了。これは元のコードと全く同じではありません。 –

+0

私はあなたが何を正確にしようとしているのか、なぜこれが必要なのか不思議に思うのを助けることはできません。 –

答えて

3

これは、83258に提出されたgccバグです。

C++ 14では、ポインタ型の非型テンプレートパラメータではlinkage requirementでした。しかし、C++ 17(N4268の結果)では、このパラメータは正しいタイプのconverted constant expressionである必要がありますが、いくつかの制限があります(どれもここでは関係ありません)。 fpを作成すると、それをテンプレートパラメータとして使用できるはずです。

関連する問題