正确获取c ++ 11自动初始化语法

时间:2014-12-30 17:00:21

标签: c++11

我是C ++的新手程序员(但是其他语言的资深程序员),我正在尝试在我的代码中使用“Modern 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!

1 个答案:

答案 0 :(得分:2)

由于所有答案都在评论中,我以为我会通过自己做一个官方答复来完成这个。

我正在使用一个没有可移动流的c ++库,这很重要,因为

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

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

我原本以为

auto varname = typename{...};

在概念上与

相同
typename varname{...};

但事实并非如此。因此,这是一个不能使用auto创建变量的实例。

(叹气)我真的大肆宣传在任何地方使用auto