我將從示例開始。 boost中有一個很好的「tokenizer」類。它有一個字符串被標記化如在構造函數的參數:在構造函數中傳遞指針/引用到現有對象的首選方式是什麼?
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 */
字符串未在標記生成器修飾的,所以它是由常量對象引用傳遞。因此,我可以在那裏傳遞一個臨時對象:
boost::tokenizer<boost::char_separator<char> > my_tok(std::string("a bb ccc ddd 0"));
/* do something with my_tok */
一切都看起來不錯,但如果我嘗試使用標記生成器,災難發生時。經過簡短的調查,我意識到,tokenizer類存儲了我給它的引用,並用於進一步的使用。當然,它不適合引用臨時對象。
該文檔沒有明確表示,在構造函數中傳遞的對象將在稍後使用,但好吧,也沒有說明,它不會是:)所以我不能假設這是我的錯誤。
但是有點令人困惑。在一般情況下,當一個對象通過const引用接受另一個對象時,它表明可以在那裏給出臨時對象。你怎麼看?這是一個糟糕的習俗嗎?在這種情況下應該使用指向對象的指針(而不是引用)?或者甚至更進一步 - 有一些特殊的關鍵字來允許/禁止給予臨時對象作爲參數是否有用?
編輯:文檔(1.49版)是相當簡約,並且可以建議這樣的問題的唯一部分是:
注:沒有解析是在建設實際進行。解析是按需完成的,因爲令牌是通過begin提供的迭代器訪問的。
但它沒有明確說明,將使用相同的對象。
但是,這個問題的重點是在這種情況下對編碼風格的討論,這只是一個啓發我的例子。
被同樣的事情咬傷。當我可以的時候,我使用boost :: ref作爲ctor arg現在至少提示參考將被存儲 – Anycorn 2012-03-05 11:07:30
如果在boost :: tokenizer中確實存在這樣的錯誤,我會感到驚訝。 – CashCow 2012-03-05 11:08:28
@CashCow:它更多的是在文檔中的一個bug,因爲'tokenizer'在它的生命週期中保持對構造函數參數的引用,這對於臨時對象來說是地獄般的... – 2012-03-05 13:04:52