Почему запятая в индексации устарела в 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 шт):
Думаю что не было проблем и не путали с 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 withyas 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]) - конец примера] оператор запятая, как описано в этом подпункте, может появляются только в скобках.