В книге программирования языка программирования Stroustrup С++ (3-е издание) в главе Numerics он показывает следующий фрагмент кода:
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;
}
Проблема заключается в том, что v_even
и v_odd
являются неконстантными ссылками на временные разделы, что недопустимо. И попытка скомпилировать это испускает ошибку:
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)];
^ ~~~~~~~~~~~~~~~~~~~~~~~~
Я проверил все доступные ошибки в сети, и нет ничего, что касалось этой фундаментальной проблемы. Я что-то упускаю? Изменился ли этот язык в связи с тем, что книга была напечатана (маловероятно, поскольку сама книга упоминает правило против неконстантных ссылок на временные)? Что здесь происходит?
Если я изменяю функцию, чтобы использовать значения вместо ссылок, например. slice_array<double> v_even = ...
, то это фактически компилируется. Однако выясняется, что мои локальные заголовки С++ делают публичный конструктор копий, тогда как Stroustrup и различные онлайн-ссылки (cppreference.com, cplusplus.com) утверждают, что конструктор копирования является закрытым. Я предполагаю, что это решение не переносится. Это подкрепляется тем фактом, что Stroustrup явно перечисляет образец кода с неосновными переменными и говорит, что это приводит к ошибке.
Спецификация С++ 98 (PDF) объявляет slice_array<T>
как имеющий закрытый конструктор копирования. К 2005 году (согласно эта спецификация), и предположительно как часть С++ 03, это изменилось на публичный конструктор копий.