2016-12-24 4 views
7

は、次のコードを考えてみましょう:キャプチャしていないジェネリックlambdaは関数ポインタに崩壊する必要がありますか?

int main() { 
    auto l = [](auto){}; 
    void(*p)(int) = l; 
} 

それは両方GCCclangでうまく動作します。
のは、以下の少し変更したバージョンを考えてみましょう:GCC rejects itながら、まだこの場合

int main() { 
    auto l = [](auto...){}; 
    void(*p)(int) = l; 
} 

、打ち鳴らすaccepts itを。

このコードを拒否する理由はありますか、それともコンパイラのバグですか?


は、私は問題を開くつもりですが、私はそれらのいずれかではなく、他のいずれかによって実施されている可能性のある提案が存在するかどうかを知りたいのです。

+1

GCCコンパイラ(5.1.0)は実装されていないことを伝えます:「実装されていません:実装されていないラムダを使用しています...」アクセプタポインタ「 –

+0

@lapteveloper Ahahah ...モバイルで試しました。携帯電話でのgodboltはユーザーフレンドリーではありませんでしたが、短くなっていました(おそらくカットアウト)。良いキャッチ、それを見ていない。だから、私は問題を開くことはありません、彼らはすでにそれを知っている!ありがとうございました。私は自分自身の質問を閉じるつもりです。 – skypjack

+3

エラーメッセージはかなり明確で、実際の質問はここにありません。 – skypjack

答えて

11

これは、既知のGCC解析バグ(6409568071):[](auto...){}が誤っ[](auto, ...) {}なく[](auto...x){}ように解析されています。 C-スタイルは、言語弁護士の観点でパラメータパックを(宣言ではなく、可変引数として省略記号が解析され、それが[dcl.fct]/17に違反して、パラメータ宣言節ではなく抽象宣言子の一部として解析されています)。

[](auto, ...){}void (*)(int)に変換できません。

回避策は、パックに名前を付けることです。そうすると、変換が正常にコンパイルされることがわかります。

関連する問題