C++11 获取c++;11自动初始化语法正确 我是C++ C++新手程序员,但我是一个精通其他语言的程序员,我在代码中使用“现代C++”。

C++11 获取c++;11自动初始化语法正确 我是C++ C++新手程序员,但我是一个精通其他语言的程序员,我在代码中使用“现代C++”。,c++11,C++11,我想知道我在这里做错了什么,试图从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{

我想知道我在这里做错了什么,试图从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
}
#包括
#包括
甲级{
公众:
void foo();
私人:
boost::asio::streambuf cmdStreamBuf{};
};
void A::foo(){
std::istream is1{&cmdStreamBuf_};//有效
auto is2=std::istream{&cmdStreamBuf_};//未编译
}
我得到这个错误:

try.cpp:13:41: error: use of deleted function 'std::basic_istream<char>::basic_istream(const std::basic_istream<char>&)'
try.cpp:13:41:错误:使用删除的函数'std::basic\u istream::basic\u istream(const std::basic\u istream&)'

我不是在模仿;我以为我在构建一个std::istream

因为所有的答案都在评论中,我想我应该自己做一个正式的回答来结束这一切

我使用的是一个没有活动流的C++库,这是因为

auto is2 = std::istream{&cmdStreamBuf_};
创建一个新的
std::istream
,然后用该右值(临时对象)初始化
is2
。它通过调用复制构造函数或移动构造函数来初始化它。我的C++库显然没有这些构造函数中的任何一个,因此调用失败。 我原本以为

auto varname = typename{...};
在概念上与

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


(叹气)我在所有地方都使用了
auto

您可能使用的libstdc++版本没有可移动的流。@t.C.谢谢,但问题是在编译时。我编辑了我的帖子,明确地说了这一点,并显示了我得到的错误。当您在声明中初始化变量时,您隐式地调用了复制构造函数(或者如果支持,则调用“移动”构造函数)。这正是问题所在。
auto-is2=std::istream{&cmdStreamBuf}语法从技术上构造一个临时的
std::istream
,然后将其移动/复制到
is2
;移动/复制可以并且将被编译器省略,但是移动/复制构造函数必须仍然可用。流是不可复制的,并且您的标准库也没有提供移动构造函数,因此无法编译。由于
std::istream
的移动构造函数即使在那里也会受到保护,因此您根本不能使用此语法。@t.C.
std::istream
的移动构造函数受到保护:不知道演示文稿中的确切位置,但Herb Sutter在这里有整整一章提倡在几乎所有地方使用
auto
。这涉及到很多问题,包括你的案子。@bolov我知道;这就是我开始走这条路的原因。也许我在演讲中遗漏了什么……不,我没有把链接放在你的答案上,我放在这里是因为它整体上很有趣。(事实上,其中一个不能使用auto的例子是使用不可移动的字体)