C , ostream

#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 делает трудным, но не невозможным. Ваш компилятор должен был пожаловаться.