c++ - 从流中读取以初始化只读变量

标签 c++ stream initialization constants

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

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。我只想从流中读取空格分隔的字符串。

最佳答案

不幸的是,由于 istream 的限制,您尝试执行的操作是不可能的。接口(interface),它适用于非常量引用。在变量被修改后“添加 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);

关于c++ - 从流中读取以初始化只读变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60462815/

相关文章:

c++ - 我应该如何在 C++ 中保存和加载游戏的用户配置文件?

c++ - 检查迭代器中是否倒数第二

python - 如何将异步操作映射到有序数据流并获得相同顺序的结果?

c++ - 将文件流重定向到内存流

c++ - 结构初始化

c++ - 为什么 c++ 标准支持函数 strftime 但不支持 strptime?

java - 内存映射输出流生成带有尾随零的输出文件

java - 如何静态初始化二维列表?

C++:如何通过初始化列表进行构造?

c++ - BlueZ5 : Event when inbound pairing is complete