call to deleted constructor of ‘std::istream’ (aka ‘basic_istream’)
示例代码
#include<iostream>
using namespace std;
int main()
{
std::istream is = cin; //出错代码
return 0;
}
编译代码详细错误如下(g++ main.cpp --std=c++11 -o main):
In file included from /usr/include/c++/5/iostream:40:0,
from main.cpp:8:
/usr/include/c++/5/istream: In function ‘int main()’:
/usr/include/c++/5/istream:611:7: error: ‘std::basic_istream<_CharT, _Traits>::basic_istream(const std::basic_istream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’ is protected
basic_istream(const basic_istream&) = delete;
^
main.cpp:27:23: error: within this context
std::istream is = cin;
^
main.cpp:27:23: 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>]’
In file included from /usr/include/c++/5/iostream:40:0,
from main.cpp:8:
/usr/include/c++/5/istream:611:7: note: declared here
basic_istream(const basic_istream&) = delete;
分析:
- 对象赋值时是调用拷贝构造函数进行赋值的
#include<iostream>
using namespace std;
class Demo {
public:
Demo(int i) {
number = i;
cout << "Demo constructor" << endl;
}
Demo(const Demo &demo) {
number = demo.number;
cout << "copy constructor" << endl;
}
int geti()
{
return number;
}
private:
int number;
};
int main() {
Demo d(1);
Demo d2 = d;
cout << d2.geti() << endl;
return 0;
}
输出结果:
Demo constructor
copy contuctor
1
所以出错代码std::istream is = cin; 隐藏调用了istream的拷贝函数。
2. istream的拷贝函数
由于istream的拷贝函数是protected(只能给子类调用),无法调用,所以出错。
解决:
针对这种问题,可使用下面代码替换,使用引用来达到效果。
std::istream& is = cin;