3

GCC にバグを報告しましたが、私の予想が正しいかどうか知りたいです。

この提案と次の折り畳み式を検討してください。

(args < ...)

次と同等である必要があります。

((args$0 < args$1) < ...) < args$n

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

#include <cassert>
int main() {
    assert((0 < 42) < 3);
}

アサートはコンパイルされ、適切に動作し、失敗しません (確かに、結果が ((0 < 42) and (42 < 3)) ではないことに注意してください。式自体は非常に珍しく無意味です)。
一方、fold 式を使用する場合:

template<int... I>
static constexpr bool f() {
    return (I < ...);
}

int main() {
    static_assert(f<0, 42, 3>(), "!");
}

アサートはコンパイル時に失敗します (GCC 6.1.0)。
提案に含まれているもののために、それがコンパイルされることを期待しています。
折り畳み式を含まない上記の例と同等であるため、成功するはずです。
アンパックされた式は、((0 < 42) < 3) である必要があります。

私は正しいですか、それとも折り畳み式についてここで重要なことを見逃していますか?

4

1 に答える 1