C++编译错误:valarrays出现奇怪的问题

3

我在使用C++的valarrays时遇到了一个奇怪的编译错误。

这是我的代码的简化版本:

#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;
}

预期行为:输出true1的某个变体。

编译错误(使用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个回答

8
问题在于使用==比较valarrays时,不会返回bool,而是返回std::valarray<bool>,对每个元素进行逐个比较。
如果要比较它们是否相等,可以对结果调用min(),因为false < true
return (a*x==b).min();

谢谢!我最初认为==运算符在valarrayvector上的工作方式相同(即返回bool)。此外,我很惊讶比较bool不会导致编译错误。遗憾的是,没有更简单的方法来比较valarray的相等性。 - Theemathas Chirananthavat
这种方法效率低下,因为它不支持短路。有没有其他解决方案? - a06e

5
你阅读文档时有什么疑问吗?对于valarrays而言,==不能按此方式运行。它会按索引比较每个元素并返回一个包含每个结果的bool类型的新valarray。
事实上,valarrays的整个目的是在无需编写循环的情况下,快速且轻松地操作有序值集。参考:https://dev59.com/yGjWa4cB1Zd3GeqPudWm#12580789

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接