c++11 - 正确使用 c++11 自动初始化语法

标签 c++11

我是 C++ 新手程序员(但也是其他语言的资深程序员),我正在尝试在我的代码中使用“现代 C++”。

我想知道我在这里做错了什么,尝试从 boost::asio::streambuf 初始化 istream:

#include <iostream>
#include <boost/asio/streambuf.hpp>

class A {
  public:
    void foo();
  private:
    boost::asio::streambuf cmdStreamBuf_{};
};

void A::foo() {
  std::istream is1{&cmdStreamBuf_}; // works
  auto is2 = std::istream{&cmdStreamBuf_}; // does not compile
}

我收到此错误:

try.cpp:13:41: error: use of deleted function 'std::basic_istream<char>::basic_istream(const std::basic_istream<char>&)'

我并不是想复制;我以为我正在构建一个 std::istream!

最佳答案

由于所有答案都在评论中,我想我应该自己做一个正式答案来结束这个问题。

我使用的 C++ 库没有可移动流,这很重要,因为

auto is2 = std::istream{&cmdStreamBuf_};

创建一个新的std::istream,然后使用该右值(临时对象)初始化is2。它通过调用复制构造函数或移动构造函数来初始化它。我的 C++ 库显然没有这些构造函数,因此调用失败。

我原本是这么想的

auto varname = typename{...};

概念上与

相同
typename varname{...};

但事实并非如此。因此,在这种情况下,您无法使用 auto 创建变量。

(叹气)我真的很喜欢在任何地方使用 auto

关于c++11 - 正确使用 c++11 自动初始化语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27709457/

相关文章:

c++ - 我们可以在不使用构造函数的情况下推回包含 vector 的结构吗?

c++ - 包装二进制缓冲区 - 可能没有多余的移动/复制?

c++ - C++ 中 CV 限定的基类

c++ - "Moving out"对象的内部表示。好不好?

c++ - 方法返回容器用于基于范围的 for 循环

c++ - 用Pin工具打印每条指令的程序和函数名

c++ - 现在从 C++11 中的 "return"语句到 "switch"是错误的吗?

c++ - 如何在 MinGW 中启用实验性 C++11 并发功能?

C++11 - enable_if - 类定义之外的函数实现

c++ - 接收任何标准 map 的功能模板