2010-05-06 4 views
2

g ++ permet cette construction d'un istream_iterator d'une instance ifstream:Pourquoi ne puis-je pas construire un std :: istream_iterator avec un temporaire sans nom?

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

... mais il ne permet pas la même construction avec un temporaire sans nom:

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

Cela donne:

erreur: aucune fonction correspondante pour l'appel à 'std :: istream_iterator, ptrdiff_t> :: istream_iterator (std :: ifstream)'

Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas? - Merci!

Répondre

7

Ce n'est pas le cas, car le paramètre constructeur istream_iterator est une référence non-const, mais vous fournissez une valeur temporaire. Vous ne pouvez pas fournir de temporaires (qui sont des valeurs rv) à des références non-const. Mais mis à part, même si cela prenait une référence const, cela ne marcherait toujours pas, car ifstream n'est pas copiable. Curieusement, C++ requiert un constructeur de copie accessible pour lier un rvalue à une référence non-const.

+0

Merci, Johannes! – Stumped6789

+1

Et puis, encore une fois, si cela était autorisé, vous créeriez un itérateur à un ifstream déjà détruit, et ce serait UB –

1

Le flux est transmis par référence non-const, mais un temporaire ne peut être passé que par référence-const.

Les flux sont essentiellement transmis par référence non-const, car presque tout ce que vous faites avec un flux peut/va modifier l'état du flux.

Questions connexes