Почему я не могу создать std :: istream_iterator с неназванным временным? - PullRequest
2 голосов
/ 06 мая 2010

g ++ позволяет эту конструкцию istream_iterator из экземпляра ifstream:

std::ifstream ifstr("test.txt");
std::istream_iterator<std::string> iter1(ifstr);

... но он не допускает такую ​​же конструкцию с неназванным временным:

std::istream_iterator<std::string> iter2(std::ifstream("test.txt"));

Это дает:

ошибка: нет соответствующей функции для вызова ‘std :: istream_iterator, ptrdiff_t> :: istream_iterator (std :: ifstream)’

Кто-нибудь знает, почему это не работает? - спасибо!

Ответы [ 2 ]

7 голосов
/ 06 мая 2010

Это не так, потому что параметр конструктора istream_iterator является неконстантной ссылкой, но вы предоставляете временную. Вы не можете предоставить временные значения (которые являются значениями) для неконстантных ссылок.

Но, если не считать ссылки на const, она все равно не будет работать, поскольку ifstream не копируется. Любопытно, что C ++ требует доступного конструктора копирования, чтобы связать значение с неконстантной ссылкой.

1 голос
/ 06 мая 2010

Поток передается по неконстантной ссылке, но временный может передаваться только по константной ссылке.

Потоки по сути всегда передаются по неконстантной ссылке, потому что почти все, что вы делаете с потоком, может / изменит состояние потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...