Чтение из потока для инициализации переменной только для чтения - PullRequest
1 голос
/ 29 февраля 2020

Я ищу альтернативу следующему коду

void foo(std::istream& in) {
    /*const*/ std::string token;
    in >> token;
}

, где токен локальной переменной может быть const. Я мог бы представить следующее решение с использованием IIFE, но оно выглядит крайне сложным:

void foo(std::istream& in) {
    const std::string token = [&]{
        std::string v;
        in >> v;
        return v;
    }();
}

Есть ли более простые альтернативы? (без вызова других собственных вспомогательных функций).

Редактировать: нет необходимости использовать >> - op. Я хочу читать только разделенную пробелами строку из потока.

Ответы [ 2 ]

2 голосов
/ 29 февраля 2020

К сожалению, то, что вы пытаетесь сделать, невозможно из-за ограничений интерфейса istream, который работает с неконстантными ссылками. Лучший способ «добавить const» в переменную после ее изменения - использовать вспомогательную функцию (или лямбду):

template <typename T, typename CharT, typename Traits>
T read_from(std::basic_istream<CharT, Traits>& is)
{
    T value;
    is >> value;
    return value;
}

, а затем полагаться на оптимизацию именованного возвращаемого значения (NRVO) для исключения дополнительной переменной: (даже если NRVO не происходит, значение перемещается вместо копирования)

const auto token = read_from<std::string>(in);
1 голос
/ 29 февраля 2020

Просто прочитайте в другую переменную:

void foo(std::istream& in) {
    std::string token_read;
    in >> token_read;
    const std::string token = std::move(token_read);
}
...