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
будет левый сгиб