En C de BS ++ libro Programming Language (3ª edición), en el capítulo numéricos que muestra el siguiente fragmento de código:¿Cómo toma Stroustrup una referencia no constante a un temporal?
void f(valarray<double>& d)
{
slice_array<double>& v_even = d[slice(0,d.size()/2,2)];
slice_array<double>& v_odd = d[slice(1,d.size()/2,2)];
v_odd *= v_even;
v_even = 0;
}
El problema es, v_even
y v_odd
son referencias no constante a los temporales, que no es permitido. Y el intento de compilar este emite un error:
error: non-const lvalue reference to type 'slice_array<double>' cannot bind to a temporary of type 'slice_array<double>'
slice_array<double>& v_even = d[slice(0,d.size()/2,2)];
^ ~~~~~~~~~~~~~~~~~~~~~~~~
yo nos registramos a través de todas las erratas disponibles en línea y no hay nada que toca este problema fundamental. ¿Me estoy perdiendo de algo? ¿Ha cambiado el lenguaje en este sentido desde que el libro fue impreso (poco probable, ya que el libro mismo menciona la regla contra las referencias no const a los temporales)? ¿Que está pasando aqui?
Si modifico la función para usar valores en lugar de referencias, p. slice_array<double> v_even = ...
, entonces esto realmente compila. Sin embargo, resulta que mis encabezados C++ locales hacen que el constructor de copias sea público, mientras que Stroustrup y varias referencias en línea (cppreference.com, cplusplus.com) afirman que el constructor de copias es privado. Supongo que eso significa que esta solución no es portátil. Esto se ve reforzado por el hecho de que Stroustrup enumera explícitamente una muestra de código con variables que no son de referencia y dice que esto produce un error.
La especificación C++ 98 (PDF) declara slice_array<T>
como tener un constructor de copia privada. En 2005 (según this spec), y presumiblemente como parte de C++ 03, esto cambió a un constructor de copia pública.
"_El cambio de idioma a este respecto desde que se imprimió el libro_" La regla de enlace de referencia es muy antigua; 'valarray' es más reciente. Parece un error (por BS). – curiousguy
@ curiousguy: El libro ha pasado por 20 impresiones.Miré a través de toda la errata; 2 impresiones hicieron cambios en esta función, pero de manera divertida, el segundo cambio revertió realmente el primero. Y ninguno de los cambios estaba relacionado con el tema en cuestión. –
"_El libro ha pasado por 20 printings._" y comienza a converger? – curiousguy