Существует трюк, называемый шаблонами выражений, который позволяет повысить эффективность составных выражений, но ужасно ломается с использованием auto
.
Измените это:
auto w = v * 2;
на следующее:
std::valarray<int> w = v * 2;
и ваш код работает.
Чтобы понять, почему мы хотим использовать шаблоны выражений, попробуйте следующее:
std::valarray<int> a={1,2,3},b{4,5,6},c={2,4,8};
std::valarray<int> r = (a+b*2)*c;
здесь шаблоны выражений избегают созданиявременный valarray a+b*2
или b*2
, но вместо этого передайте все выражение вниз и создайте r
с поэлементными операциями.
Никакие 3-элементные временные значения valarray не создаются в (a+b*2)*c
- просторяд объектов, которые описывают структуру выражения и аргументы.При назначении фактическому valarray
выражение затем оценивается поэлементно.
Но auto
не преобразуется в valarray
;он просто хранит объект шаблона выражения.Так что ваш код ломается.
Я не знаю, какие версии стандарта позволяют это или нет;независимо от того, некоторые реализации valarray используют это, и это добавляет большую эффективность.Без этого valarray откровенно отстой.