【发布时间】:2019-11-30 18:11:51
【问题描述】:
这里有一些代码:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <istream>
#include <ostream>
class A {
int *m;
std::istream in;
A(int *m, std::string file): m{m}, in{std::ifstream{file}} { foo(); }
public:
A(int *m): m{m}, in{std::cin} { foo(); }
void foo() {}
};
int main() {
return 0;
}
当我尝试做g++ -std=c++14 main.cc 时,我最终得到的是:
$ g++ -std=c++14 main.cc
main.cc: In constructor ‘A::A(int*, std::__cxx11::string)’:
main.cc:11:62: error: ‘std::basic_istream<_CharT, _Traits>::basic_istream(std::basic_istream<_CharT, _Traits>&&) [with _CharT = char; _Traits = std::char_traits<char>]’ is protected within this context
A(int *m, std::string file): m{m}, in{std::ifstream{file}} { foo(); }
^
In file included from /usr/include/c++/7/iostream:40:0,
from main.cc:1:
/usr/include/c++/7/istream:613:7: note: declared protected here
basic_istream(basic_istream&& __rhs)
^~~~~~~~~~~~~
main.cc: In constructor ‘A::A(int*)’:
main.cc:13:33: error: ‘std::basic_istream<_CharT, _Traits>::basic_istream(const std::basic_istream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’ is protected within this context
A(int *m): m{m}, in{std::cin} { foo(); }
^
In file included from /usr/include/c++/7/iostream:40:0,
from main.cc:1:
/usr/include/c++/7/istream:611:7: note: declared protected here
basic_istream(const basic_istream&) = delete;
^~~~~~~~~~~~~
main.cc:13:33: error: use of deleted function ‘std::basic_istream<_CharT, _Traits>::basic_istream(const std::basic_istream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’
A(int *m): m{m}, in{std::cin} { foo(); }
^
In file included from /usr/include/c++/7/iostream:40:0,
from main.cc:1:
/usr/include/c++/7/istream:611:7: note: declared here
basic_istream(const basic_istream&) = delete;
^~~~~~~~~~~~~
我知道不可能对istream 进行任何类型的分配,但我至少认为我可以构造一个,就像ifstream 和其他人一样。我在这里做错了什么?
编辑:即使将in 设为参考也会导致:
main.cc: In constructor ‘A::A(int*, std::__cxx11::string)’:
main.cc:11:62: error: cannot bind non-const lvalue reference of type ‘std::istream& {aka std::basic_istream<char>&}’ to an rvalue of type ‘std::basic_istream<char>’
A(int *m, std::string file): m{m}, in{std::ifstream{file}} { foo(); }
^
这是为什么?
【问题讨论】:
-
您不能复制
cin,但可以存储对它的引用。只需将in作为参考,它应该可以解决它。但是,看到您的编辑,您将无法将临时引用绑定到非常量引用。 -
@iz_ 好的,这样做:
const std::istream &in;使其编译,但我通过使其成为const会失去任何东西吗?因为我们永远不会分配给istream,不是吗? -
通过从流中读取,你正在改变它。
const将使其无法读取流。 -
@iz_ 有没有优雅的解决方案?您如何从中读取信息并将其作为成员(拥有它)?
-
以下核桃的解决方案对我来说看起来不错。
标签: c++