无法分配或复制iostream对象?

Alc*_*ott 2 c++ iostream initializer-list

iostream和其他流类实际上不是类,但typedefs,对吗?

这是问题所在,我试图istream在初始化列表中初始化一个对象,但不幸的是我收到了一个错误,代码如下:

class A 
{
    public:
        A(istream &is=cin): ais(is)
        {}

    private:
        istream ais;
};
Run Code Online (Sandbox Code Playgroud)

无法用g ++编译,错误:

synthesized method ‘std::basic_istream<char, std::char_traits<char> >::basic_istream(const std::basic_istream<char, std::char_traits<char> >&)’ first required here 
Run Code Online (Sandbox Code Playgroud)

我搜索了SO,发现了,iostream cannot be assigned or copy.但为什么我不能在初始化列表中初始化它?

我想,初始化列表会调用对象的构造函数/ copy-constructor,对吧?

Dav*_*rtz 6

您的代码尝试将一个istream(传递给构造函数的代码)转换为两个istreams,即传递给构造函数的s和ais.一个istream对象代表实际流本身.只有一个流,并且无法以某种方式将其转换为两个流.

甚至不清楚这意味着什么.如果流上有一些数据,那么先读取哪个数据流得到它?或者他们都得到了吗?如果是这样,谁或什么重复呢?

An istream就像一个文件本身.如果不将数据从一个文件复制到另一个文件,则无法将一个文件转换为两个文件.但是,您可以根据需要使用相同数量的引用或指针istream.您的问题的解决方案可能是作出ais参考.


hmj*_*mjd 5

您将成员变量声明为:

istream ais;
Run Code Online (Sandbox Code Playgroud)

这意味着将在初始化列表中调用复制构造函数。这不是特定于初始值设定项列表的:您不能在任何地方执行此操作。

您可以将成员变量更改为引用:

istream& ais;
Run Code Online (Sandbox Code Playgroud)

但这意味着您必须确保引用的istreamto 在 的ais生命周期内有效A