Я начну с примера. В boost есть класс "токенизатор". Он принимает строку, которая должна быть обозначена как параметр в конструкторе:
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. Поэтому я могу передать туда временный объект:
boost::tokenizer<boost::char_separator<char> > my_tok(std::string("a bb ccc ddd 0"));
/* do something with my_tok */
Все выглядит отлично, но если я попытаюсь использовать токенизатор, произойдет катастрофа. После короткого расследования я понял, что класс токенизатора хранит ссылку, которую я ему дал, и использую для дальнейшего использования. Конечно, он не может работать хорошо для ссылки на временный объект.
В документации не указано явно, что объект, переданный в конструкторе, будет использоваться позже, но в порядке, также не указано, что это не будет:) Поэтому я не могу предположить это, моя ошибка.
Это немного запутанно. В общем случае, когда один объект берет другую по ссылке const, это предполагает, что там может быть предоставлен временный объект. Как вы думаете? Это плохое соглашение? Может быть, в таких случаях следует использовать указатель на объект (а не ссылку)? Или еще дальше - не будет ли полезно иметь какое-то специальное ключевое слово для аргумента, разрешающего/запрещающего предоставление временного объекта в качестве параметра?
EDIT: документация (версия 1.49) довольно минималистична, и единственная часть, которая может предложить такую проблему:
Примечание: при построении фактически не выполняется синтаксический анализ. Анализ выполняется по требованию, так как маркеры доступны через итератор, предоставленный в начале.
Но он явно не указывает, что будет использоваться тот же объект, который был указан.
Однако в этом вопросе речь идет скорее о стиле кодирования, это только пример, который вдохновил меня.