In C di Stroustrup ++ libro Programming Language (3 ° edizione), nel capitolo Numerics mostra il seguente frammento di codice:Come fa Stroustrup a prendere un riferimento non const a un temporaneo?
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;
}
Il problema è, v_even
e v_odd
sono riferimenti non const a provvisori, che non è permesso. E il tentativo di compilare questo emette un errore:
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)];
^ ~~~~~~~~~~~~~~~~~~~~~~~~
ho controllato attraverso tutti gli errata disponibili on-line e non c'è niente che tocca questo problema fondamentale. Mi sto perdendo qualcosa? La lingua è cambiata in questo senso da quando il libro è stato stampato (improbabile, dal momento che il libro stesso menziona la regola contro i riferimenti non costali ai temporari)? Cosa sta succedendo qui?
Se modifico la funzione per utilizzare valori anziché riferimenti, ad es. slice_array<double> v_even = ...
, quindi questo in realtà compila. Tuttavia, le mie intestazioni C++ locali rendono pubblico il costruttore di copie, mentre Stroustrup e vari riferimenti online (cppreference.com, cplusplus.com) sostengono che il costruttore di copie è privato. Presumo che ciò significhi che questa soluzione non è portabile. Ciò è rafforzato dal fatto che Stroustrup elenca esplicitamente un esempio di codice con variabili non di riferimento e dice che questo produce un errore.
Spec C++ 98 (PDF) dichiara slice_array<T>
come avere un costruttore di copia privata. Entro il 2005 (secondo this spec) e presumibilmente come parte di C++ 03, questo è cambiato in un costruttore di copie pubbliche.
"_Dato il cambio di lingua in questo senso da quando il libro è stato stampato_" La regola di riferimento è molto vecchia; 'valarray' è più recente. Sembra un errore (di BS). – curiousguy
@curiousguy: il libro ha attraversato 20 stampe.Ho guardato attraverso tutti gli errata; 2 stampe apportate modifiche a questa funzione, ma in modo divertente, il secondo cambiamento effettivamente ripristinato il primo. E nessuno dei due cambiamenti era legato al problema in questione. –
"_Il libro ha attraversato 20 stampe._" e inizia a convergere? – curiousguy