Поведение mask_array в libstdStack Overflow

Случай 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 ++, или я должен ожидать этого результата и почему?

Проверены настройки компилятора:

  • g ++ 4.8.2 -O0 -g -std = c ++ 0x
  • clang ++ -O0 -g -std = c ++ 11

Я считаю, что моя версия libstdc ++ является 3.4.19 (только что следовал этот найти его)

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]