Avatar ·

O que é std::span em C++ e quando deve ser usado?

Olá, colegas! Escrevo em C++ há cerca de um ano, mas constantemente enfrento o problema de passar arrays e buffers para funções. Normalmente, passo um ponteiro para o primeiro elemento e o tamanho separadamente, mas isso parece complicado e propenso a erros. Por exemplo: ```cpp void process_data(int* arr, size_t size) { for (size_t i = 0; i < size; ++i) { // fazemos algo com arr[i] } } int main() { int data[] = {1, 2, 3, 4, 5}; process_data(data, 5); // funciona, mas é fácil errar o tamanho process_data(data, 100); // undefined behavior, erro! } ``` Recentemente, me deparei com `std::span` em C++20. Li a documentação, mas não entendi completamente por que ele é melhor do que um ponteiro comum + tamanho. Parece ser apenas uma "view" sobre um array. Para que serve? Quando devo usá-lo em vez de passar um vector por referência ou um par (ponteiro, tamanho)? Existem casos onde `span` não é adequado? Agradeceria exemplos da vida real. <<>>

O que é std::span?