Как Страуструп принимает неконстантную ссылку -на временную?

В книге Страуструпа «Язык программирования C++» (, 3-е издание ), в главе «Числа» он показывает следующий фрагмент кода:

void f(valarray& d)
{
    slice_array& v_even = d[slice(0,d.size()/2,2)];
    slice_array& 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' cannot bind to a temporary of type 'slice_array'
    slice_array& v_even = d[slice(0,d.size()/2,2)];
                         ^        ~~~~~~~~~~~~~~~~~~~~~~~~

Я проверил все опечатки, доступные в Интернете, и ничего не касалось этой фундаментальной проблемы. Я что-то упускаю? Изменился ли язык в этом отношении с тех пор, как книга была напечатана (маловероятно, так как в самой книге упоминается правило против не -неконстантных ссылок на временные )? Что тут происходит?


Если я изменю функцию, чтобы использовать значения вместо ссылок, например. slice_array v_even =..., то это действительно компилируется. Однако оказалось, что мои локальные заголовки C++ делают конструктор копирования общедоступным, в то время как Stroustrup и различные онлайн-справочники (cppreference.com, cplusplus.com )утверждают, что конструктор копирования является закрытым. Я предполагаю, что это означает, что это решение не является -переносимым.Это подкрепляется тем фактом, что Страуструп явно перечисляет пример кода с не ссылочными переменными -и говорит, что это приводит к ошибке.


Спецификация C++98(PDF)объявляет slice_arrayкак имеющий закрытый конструктор копии. К 2005 году (согласно этой спецификации), и, предположительно, как часть C++03, это было изменено на общедоступный конструктор копирования.

28
задан Lily Ballard 14 August 2012 в 17:14
поделиться