Случай 1:
std::valarray<int> data = {1,4,0,2,5};
std::valarray<bool> exp_mask = data <= 2;
std::mask_array<int> marr1 = data[mask];
marr1 = 10;
случай 2:
std::valarray<int> data = {1,4,0,2,5};
data[data <= 2] = 11; // 7
случай 3:
std::valarray<int> data = {1,4,0,2,5};
std::mask_array<int> marr2 = data[data <= 2];
marr2 = 12;
Случай 1 и случай 2 работают как положено (данные соответствующим образом изменены). Тем не менее, случай 3 терпит неудачу ужасно и ненадежно (для меня это segfaults). После дальнейшей проверки с помощью gdb, похоже, что внутренне сохраненная маска указывает на буфер временного data <= 2
valarray, который уничтожается после строки 2. Затем, когда строка 3 переходит к записи, маска является полным мусором, и попытка индексировать ее, чтобы установить маскированные значения данных, является неопределенным поведением.
Я нигде не могу найти в стандарте, почему такое поведение разрешено (стандарт странно расплывчат в отношении valarray). Это ошибка libstdc ++, или я должен ожидать этого результата и почему?
Проверены настройки компилятора:
Я считаю, что моя версия libstdc ++ является 3.4.19 (только что следовал этот найти его)
Задача ещё не решена.