Ich werde mit einem Beispiel beginnen. Es gibt eine schöne "Tokenizer"-Klasse in boost. Sie nimmt eine Zeichenkette, die tokenisiert werden soll, als Parameter in einem Konstruktor an:
std::string string_to_tokenize("a bb ccc ddd 0");
boost::tokenizer<boost::char_separator<char> > my_tok(string_to_tokenize);
/* do something with my_tok */
Die Zeichenkette wird im Tokenizer nicht verändert, also wird sie per const-Objektreferenz übergeben. Daher kann ich dort ein temporäres Objekt übergeben:
boost::tokenizer<boost::char_separator<char> > my_tok(std::string("a bb ccc ddd 0"));
/* do something with my_tok */
Alles sieht gut aus, aber wenn ich versuche, den Tokenizer zu verwenden, kommt es zu einer Katastrophe. Nach kurzer Untersuchung wurde mir klar, dass die Tokenizer-Klasse den Verweis, den ich ihr gegeben habe, speichert und bei weiterer Verwendung verwendet. Natürlich kann es nicht gut funktionieren für den Verweis auf temporäre Objekt.
In der Dokumentation steht nicht explizit, dass das im Konstruktor übergebene Objekt später verwendet wird, aber ok, es steht auch nicht drin, dass es nicht verwendet wird :) Ich kann das also nicht annehmen, mein Fehler.
Es ist jedoch ein wenig verwirrend. Im allgemeinen Fall, wenn ein Objekt ein anderes durch eine Konstantenreferenz aufnimmt, suggeriert es, dass ein temporäres Objekt dort gegeben werden kann. Was meinen Sie dazu? Ist dies eine schlechte Konvention? Vielleicht sollte in solchen Fällen ein Zeiger auf ein Objekt (statt einer Referenz) verwendet werden? Oder noch weitergehend - wäre es nicht nützlich, ein spezielles Schlüsselwort für ein Argument zu haben, das die Übergabe eines temporären Objekts als Parameter erlaubt/verbietet?
EDIT: Die Dokumentation (Version 1.49) ist eher minimalistisch und der einzige Teil, der auf ein solches Problem hinweisen könnte, ist:
Hinweis: Bei der Erstellung wird kein Parsing durchgeführt. Das Parsing wird bei Bedarf durchgeführt, wenn auf die Token über den von begin bereitgestellten Iterator zugegriffen wird.
Es wird jedoch nicht ausdrücklich gesagt, dass dasselbe Objekt verwendet wird, das angegeben wurde.
Der Sinn dieser Frage ist jedoch eher eine Diskussion über den Codierungsstil in einem solchen Fall, dies ist nur ein Beispiel, das mich inspiriert hat.