2010-05-06 2 views
2

г ++ позволяет эту конструкцию istream_iterator из ifstream Например:Почему я не могу построить std :: istream_iterator с неназванным временным?

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)'

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

ответ

7

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

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

+0

Спасибо, Йоханнес! – Stumped6789

+1

И снова, если это было разрешено, вы создадите итератор для уже уничтоженного ifstream, и это будет UB –

1

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

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