Каков предпочтительный способ передачи указателя / ссылки на существующий объект в конструкторе?

Начну с примера. В 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. Поэтому я могу передать туда временный объект:

boost::tokenizer<boost::char_separator<char> > my_tok(std::string("a bb ccc ddd 0"));
/* do something with my_tok */

Все выглядит хорошо, но если я пытаюсь использовать токенизатор, происходит сбой. После непродолжительного расследования я понял, что класс токенизатора хранит ссылку, которую я ему дал, и использует в дальнейшем использовании. Конечно, это не может хорошо работать для ссылки на временный объект.

Документация не говорит явно, что объект, переданный в конструкторе, будет использоваться позже, но хорошо, также не заявлено, что это не будет :) Так что я не могу допустить это, моя ошибка.

Это немного сбивает с толку, однако. В общем случае, когда один объект получает другой по константной ссылке, это предполагает, что временный объект может быть предоставлен там. Как вы думаете? Это плохое соглашение? Может быть, указатель на объект (а не ссылку) следует использовать в таких случаях? Или даже дальше - не будет ли полезно иметь какое-то специальное ключевое слово для аргумента, которое разрешает / запрещает предоставление временного объекта в качестве параметра?

РЕДАКТИРОВАТЬ: документация (версия 1.49) является довольно минималистичным, и единственная часть, которая может предложить такую проблему:

Примечание. Разбор фактически не выполняется при строительстве. Разбор выполняется по требованию, так как токены доступны через итератор, предоставляемый begin.

Но это прямо не говорит о том, что будет использован тот же объект, который был указан.

Тем не менее, суть этого вопроса заключается скорее в обсуждении стиля кодирования в таком случае, это всего лишь пример, который вдохновил меня.

Ответы на вопрос(4)

Ваш ответ на вопрос