#ostream
Вопрос:
Итак, учитель дал нам это видео, я скопировал код, я работал над ним в течение нескольких дней, исследовал и до сих пор понятия не имею, что все это значит? https://youtu.be/DdSvGeJZAyo?t=519
#include <iostream>
#include <fstream>
using namespace std;
int main() {
string name;
cout << "write your name " << endl;
cin>> name;
ostream amp;sout=name.empty() ?
cout : ofstream(name);
}
Ответ №1:
Он использует тернарный оператор для присвоения переменной одного из двух значений. Это эквивалентно:
if (name.empty())
sout = cout;
else
sout = ofstream(name);
Причина использования тернарного оператора вместо if
этого заключается в том, что sout
это ссылка, которая должна быть связана с существующим объектом при его создании. То есть вы не можете объявить ссылку, а затем назначить ее ссылку позже.
Оба std::cout
и std::ofstream
s являются потомками std::ostream
, поэтому вы можете использовать sout
их в качестве выходного потока, не заботясь о том, является ли это на самом деле терминалом или файлом.
Однако данный код содержит ошибку, поскольку он создает ссылку на временный объект. Как только оператор выполнен, вновь открытый файл закрывается, а файловый объект уничтожается, оставляя висячую ссылку-то, что C делает трудным, но не невозможным. Ваш компилятор должен был пожаловаться.