Странная ошибка компиляции C++ с valarrays

У меня странная ошибка компиляции с использованием valarrays в C++.

Это урезанная версия моего кода:

#include <iostream>
#include <valarray>

using namespace std;

bool test(const int &x,const valarray<int> &a,const valarray<int> &b) {
    return a*x==b;
}

int main() {
    int a1[3]= {1,2,3};
    int b1[3]= {2,4,6};
    valarray<int> a(a1,3);
    valarray<int> b(b1,3);
    int x=2;
    cout<<test(x,a,b);
    return 0;
}

Ожидаемое поведение: выводит некоторый вариант true или же 1

Ошибка компиляции (с использованием g++):

main.cpp: In function ‘bool test(const int&, const std::valarray<int>&, const std::valarray<int>&)’:
main.cpp:7:14: error: cannot convert ‘std::_Expr<std::_BinClos<std::__equal_to, std::_Expr, std::_ValArray, std::_BinClos<std::__multiplies, std::_ValArray, std::_Constant, int, int>, int>, bool>’ to ‘bool’ in return
  return a*x==b;
              ^

Что означает эта ошибка компиляции и как ее исправить?

2 ответа

Решение

Проблема в том, что сравнивая значения с == не возвращает bool, это возвращает std::valarray<bool>, делая сравнение поэлементно.

Если вы хотите сравнить их на равенство, вы можете позвонить min() на результат, так как false < true:

return (a*x==b).min();

Что мешало вам читать документацию? == не работает таким образом для valarrays. Он сравнивает каждый элемент по индексу и возвращает новое значение bools, содержащие каждый результат.

Действительно, вся цель valarrays - обеспечить быстрые и простые операции с упорядоченным набором значений без необходимости везде писать циклы.

Другие вопросы по тегам