Могу ли я вернуть диапазон в C ++?Если так, то как?(Открыт для альтернатив.) - PullRequest
0 голосов
/ 29 сентября 2019

В руководстве по выполнению задания, которое мне было дано, специально запрещено использование векторов и строк, но мне нужно передать массив char неопределенного размера из функции.Использование span похоже на то, что может быть жизнеспособным для этой цели, если я смогу лучше понять, как он используется.Если бы кто-нибудь мог порекомендовать лучший / другой способ передачи массивов (кроме строк и векторов), я бы с удовольствием узнал об этом.

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

Я хотел бы иметь возможность вызывать функциюнапример:

span<char> getSpan(){
    char arr[] = { 'A', 'B', 'C' };
    span<char> spanOut{ arr };
    return spanOut;
}

, а затем распечатать содержимое spanOut из main:

int main() {
    // Some Code...
    printSpan = getSpan();
    std::cout << printSpan;
}

В идеале, результатом вышеприведенного кода было бы напечатать ABC на терминале.

1 Ответ

1 голос
/ 29 сентября 2019

span - не принадлежащий вид.Это похоже на указатели и ссылки.Когда getSpan возвращается, локальный массив arr больше не существует.Возвращенный диапазон указывает на этот несуществующий массив, и доступ к нему приводит к неопределенному поведению.Это аналогично проблеме с висящим указателем.

Вы можете вернуть span, если убедитесь, что хранилище все еще существует после возврата функции:

auto getSpan()
{
    static char arr[] = { 'A', 'B', 'C' }; // note: static
    return span(arr);
}

Обратите внимание, что эта проблемапредставить до тех пор, пока вы возвращаете что-то с семантикой указателя (т. е. не владеющей) - итераторы, ссылки и т. д.

...