我是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!
答案 0 :(得分:2)
由于所有答案都在评论中,我以为我会通过自己做一个官方答复来完成这个。
我正在使用一个没有可移动流的c ++库,这很重要,因为
auto is2 = std::istream{&cmdStreamBuf_};
创建一个新的std::istream
,然后使用该rvalue(临时对象)初始化is2
。它通过调用复制构造函数或移动构造函数来初始化它。我的c ++库显然没有这些构造函数,因此调用失败。
我原本以为
auto varname = typename{...};
在概念上与
相同typename varname{...};
但事实并非如此。因此,这是一个不能使用auto
创建变量的实例。
(叹气)我真的大肆宣传在任何地方使用auto
。