【问题标题】:Reading from stream to initialize a read-only variable从流中读取以初始化只读变量
【发布时间】:2020-02-29 07:10:52
【问题描述】:

我正在寻找以下代码的替代方法

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

局部变量token可以是const。我可以想象以下带有 IIFE 的解决方案,但这看起来非常复杂:

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

还有更简单的选择吗? (不调用其他自己的辅助函数)。

编辑:不需要使用>>-op。我只想从流中读取空格分隔的字符串。

【问题讨论】:

    标签: c++ stream initialization constants


    【解决方案1】:

    不幸的是,由于istream 接口的限制,您尝试做的事情是不可能的,该接口适用于非常量引用。修改后向变量“添加 const”的最佳方法是使用辅助函数(或 lambda):

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

    然后依靠named return value optimization (NRVO)来消除多余的变量:(即使没有发生NRVO,值是移动而不是复制)

    const auto token = read_from<std::string>(in);
    

    【讨论】:

    • 那么我上面提到的 lambda 解决方案对我来说看起来更好。
    • @wimalopaan 这个可以重复使用。但如果你只使用一次也没关系。
    【解决方案2】:

    只需读入另一个变量:

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

    【讨论】:

    • 移动令牌而不是复制。并且 NRVO 消除了额外的变量...
    • @L.F.,同意,已修复
    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多