我是 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/