7

次のコードを検討してください。

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

GCCclangの両方で問題なく動作します。
次のわずかに変更されたバージョンを考えてみましょう。

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

この場合、clang は引き続きそれを受け入れますが、GCC はそれを拒否します。

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


私は問題を提起するつもりですが、一方ではなく他方では実装できた可能性のある提案が存在するかどうか知りたいです。

4

1 に答える 1

11

これは既知の GCC 解析バグです ( 6409568071 ):[](auto...){}誤って[](auto, ...) {}ではなく のように解析されてい[](auto...x){}ます。省略記号は、パラメーター パックを宣言するのではなく、C スタイルの varargs として解析されています (言語弁護士の用語では、 [dcl.fct]に違反して、 abstract-declaratorではなくparameter-declaration-clauseの一部として解析されています)。 /17 )。

[](auto, ...){}に変換できないことは言うまでもありませんvoid (*)(int)

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

于 2016-12-24T23:12:12.713 に答える