我将从一个例子开始。在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 */
字符串在令牌化过程中不会被修改,因此它通过const对象引用传递。因此我可以在那里传递一个临时对象:
字符串在令牌化过程中不会被修改,因此通过const对象引用传递。因此,我可以在那里传递一个临时对象:
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提供的迭代器访问标记时按需执行的。
但它没有明确说明将使用给定的同一对象。
然而,这个问题的重点在于讨论这种情况下的编码风格,这只是激发我的一个例子。