Au début elle me paraissait arbitraire, mais j'ai enfin trouvé un cas où son absence pouvait être dangereuse: Les fonctions retournant une référence vers les paramètres.

D'un autre côté, g++ autorise à appeler des fonctions membres des temporaires non-nommés, et là ça marche, donc la durée de vie doit être garantie dans ce cas...
Un point intéressant de ce côté est qu'il en est de même pour les opérateurs: Un opérateur membre compilera sans problème là où un opérateur non-membre provoquera une erreur "no match"...

Décidément les auteurs avaient plus de suite dans les idées que moi.
Code Test : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//
// Test de temporaires non-nommés couplés à l'opérateur d'insertion de flux
// (note: Je suis passé du français à l'anglais sans trop m'en rendre compte par la suite...)
//
#include <iostream>
#include <sstream>
using namespace std;
 
class pseudostream
{
	ostringstream os;
	pseudostream(pseudostream const &);
	pseudostream& operator=(pseudostream const &);
public:
	pseudostream() { cout << "(ctor)"; }
	~pseudostream() { cout << "(dtor)"; }
 
	pseudostream& put(char c) { cout << "(put)"; os.put(c); return *this; }
	pseudostream& putstring(string const &s) { cout << "(putstring)"; os << s; return *this; }
	string str() const { cout << "(str)"; return os.str(); }
 
 
	//TEST: With internal operators, there is no problem.
	pseudostream& operator<<(char const *s)
	{
		return putstring(s);
	}
	pseudostream& operator<<(string const &s)
	{
		return putstring(s);
	}//*/
};
 
 
/*
//TEST: With external operators: It doesn't match because of the rvalue.
pseudostream& operator<<(pseudostream &os, char const *s)
{
	return os.putstring(s);
}
pseudostream& operator<<(pseudostream &os, string const &s)
{
	return os.putstring(s);
}//*/
 
pseudostream& InsertString(pseudostream &os, string const &s)
{
	return os << s;
}
 
int main(void)
{
	//Test 1: No ulterior use
	pseudostream() << "abc" << "def";
	//-->PASS only with internal ops, fails to compile with external.
 
	//Test2: With ulterior use
	cout << (pseudostream() << "ghi" ).str() << endl;
	//-->PASS only with internal ops, fails to compile with external.
 
	//Test 3: Use a function instead
	//cout <<  InsertString(pseudostream(), "jkl" ).str() << endl;
	//-->FAIL
 
	//Test 4: Appel de fonction membre
	cout << ( pseudostream().put('m').put('n').put('o') ).str() << endl;
	//-->PASS
 
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	return 0;
}