Почему запятая в индексации устарела в C++20?

Почему в C++20 использование оператора , в операторе индексации массива [] стало устаревшим?

Например, следующий use-case теперь выдаёт предупреждение:

#include <cstddef>
#include <iostream>

int a[42 + 1];

void logging(std::size_t index) {
    std::cout << "[Array access: " << index << "]\n";
}

int main() {
    std::size_t index = 42;
    std::cout << a[logging(index), index] << '\n';
}

warning: top-level comma expression in array subscript is deprecated [-Wcomma-subscript]


Ответы (1 шт):

Автор решения: Aziz Umarov

Думаю что не было проблем и не путали с tuple.

Как указал @andrey-sv тут там косвенно говорится об этом.

UPD

Дополню свободным частичным переводом статьи.

P1161R3 Deprecate uses of the comma operator in subscripting expressions

Abstract

We propose to deprecate the use of the comma operator in subscripting expressions as they are not very useful, confusing and limit futures evolutions of the standard.

Аннотация.

Мы предлагаем отказаться от использования оператора запятой в индексных выражениях, поскольку они не очень полезны, сбивают с толку и ограничивают развитие стандарта будущего.

Текуший 
array[x]     // Ok
array[(x,y)] // Ok, если y это index/key
array[x,y]   // Ok, если y это index/key

Предлагаемый
array[x]      // Ok
array[(x,y)]  // Ok, если y это index/key
array[x,y]    // Устаревший, если y это index/key

Currently, a comma can appear in subscript expressions such that auto z = foo[x, y] calls the comma operator with y as the argument. While this is currently unambiguous, it is confusing when encountered and error-prone when used.

The authors think this syntax would be more useful and suited to index multidimensional classes such as mdspan.

В данный момент запятая в индексных выражениях таких как auto z = foo[x, y], вызывающая оператор запятая с y в качестве аргумента. Хотя это в настоящее время выглядит однозначно, это сбивает с толку и приводит к ошибкам при использовании.

Авторы считают, что этот синтаксис будет более полезным и подходит для индексации многомерных классов таких как mdspan.

mdspan<int, array_property::dimension<2, 3, 5>> foo(/*...*/);
int value = foo[1, 2, 3];

In contexts where comma is given a special meaning, [ Example: in lists of arguments to functions ([expr.call]) and lists of initializers ([dcl.init]) — end example ] the comma operator as described in this subclause can appear only in parentheses.

В тех случаях, когда запятая несёт особый смысл, [Пример: в списках аргументов функций ([expr.call]) и списках инициализаторов ([dcl.init]) - конец примера] оператор запятая, как описано в этом подпункте, может появляются только в скобках.

→ Ссылка