GCC распаковывает (я <...) складываю выражение неправильно

Я открыл ошибку в GCC, но я хотел бы знать, правильно ли я оправдываю свои ожидания.

Рассмотрите это предложение и следующее складное выражение:

(args < ...)

Это должно быть эквивалентно:

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

Рассмотрим следующий код:

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

Assert компилируется и работает должным образом, он не терпит неудачу (как и ожидалось, обратите внимание, что результат не ((0 < 42) и (42 < 3)), само выражение довольно необычно и бессмысленно.
С другой стороны, при использовании выражения сгиба:

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

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

Утверждение не выполняется во время компиляции (GCC 6.1.0).
Я ожидаю, что это скомпилируется из-за того, что содержится в предложении.
Это должно быть успешным, поскольку это эквивалентно приведенному выше примеру, который не включает выражения сгиба.
Распакованное выражение должно быть действительно: ((0 < 42) < 3).

Я прав или мне не хватает чего-то важного здесь в выражениях фолда?

1 ответ

Решение

N4191 был оригинальным предложением. Страница состояния C++1z GCC отмечает, что она реализует пересмотренное предложение в N4295.

Правила для левого и правого сгибов изменились, и я считаю, что ваш код теперь необходим для создания правого сгиба, т.е. 0 < (42 < 3), который false,

I < ... правая складка; ... < I будет левый сгиб

Другие вопросы по тегам