Comenzaré por ejemplo. Hay una buena clase de "tokenizer" en potencia. Se toma una cadena que se tokens como un parámetro en un constructor:¿Cuál es la forma preferida de pasar el puntero/referencia al objeto existente en un constructor?
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 */
La cadena no es Modifed en el tokenizer, por lo que se pasa por referencia objeto const. Por lo tanto me puede pasar un objeto temporal no:
boost::tokenizer<boost::char_separator<char> > my_tok(std::string("a bb ccc ddd 0"));
/* do something with my_tok */
Todo se ve muy bien, pero si trato de usar el señalizador, se produce un desastre. Después de una breve investigación, me di cuenta de que la clase tokenizer almacena la referencia que le di, y la uso en un uso posterior. Por supuesto, no puede funcionar bien para hacer referencia al objeto temporal.
La documentación no dice explícitamente que el objeto pasado en el constructor se usará más tarde, pero está bien, tampoco está indicado, que no será :) Así que no puedo asumir esto, mi error.
Sin embargo, es un poco confuso. En un caso general, cuando un objeto toma otro por referencia constante, sugiere que se puede dar un objeto temporal allí. ¿Qué piensas? ¿Es esta una mala convención? ¿Tal vez se debería usar puntero a objeto (en lugar de referencia) en tales casos? O incluso más: ¿no sería útil tener alguna palabra clave especial para el argumento que permita/desaprobe el dar un objeto temporal como parámetro?
EDIT: La documentación (versión 1.49) es bastante minimalista y la única parte que puede sugerir un problema de este tipo es:
Nota: Sin el análisis se hace realmente en la construcción. El análisis se realiza bajo demanda ya que se accede a los tokens a través del iterador provisto por begin.
Pero no establece explícitamente, que se utilizará el mismo objeto que se le dio.
Sin embargo, el objetivo de esta pregunta es más bien la discusión sobre el estilo de codificación en tal caso, este es solo un ejemplo que me inspiró.
sido mordido por lo mismo. Cuando puedo, uso boost :: ref como ctor arg ahora para al menos indicar que la referencia se almacenará – Anycorn
. Me sorprendería si realmente hay un error como este en boost :: tokenizer. – CashCow
@CashCow: es más un error en la documentación, en el sentido de que 'tokenizer' mantiene una referencia a su argumento constructor durante toda su vida, que es infernal con los temporales ... –