15

我想迭代一个临时的 valarray,但它不起作用。这是我的(非工作)代码:

#include <iostream>
#include <valarray>
int main()
{
        using namespace std;
        valarray<int> numerators = {99, 26, 25};
        valarray<int> denominators = {9, 2, 5};
        for (int i : numerators / denominators) { cout <<  i << ","; }
        // lots of errors
        return 0;
}

下面是我想要实现的最小工作示例,除了我不想定义像temp_array.

#include <iostream>
#include <valarray>
int main()
{
        using namespace std;
        valarray<int> numerators = {99, 26, 25};
        valarray<int> denominators = {9, 2, 5};
        valarray<int> && temp_array = numerators / denominators;
        for (int i : temp_array) { cout << i << ","; }
        // prints 11,13,5,
        return 0;
}

我的编译器是 g++ 版本 4.8.5(Red Hat 4.8.5-4)。我正在使用 -std=c++0x 标志进行编译。

我尝试了其他语法,例如for (auto&& i : temp_array)and for (int const & i : temp_array),但它不起作用。

4

3 回答 3

18

从文档(其中还包括在单个表达式中执行此操作的官方方法):

与其他接受 std::valarray 参数的函数不同,begin() 不能接受可能从涉及 valarray 的表达式返回的替换类型(例如由表达式模板生成的类型):std::begin(v1 + v2) 不可移植, std::begin(std::valarray(v1 + v2)) 必须改为使用。

此函数的目的是允许 range for 循环与 valarray 一起使用,而不是提供容器语义。

至于可能是什么原因,还有这个(@chris 指出):

[算术运算符] 可以用不同于 std::valarray 的返回类型来实现。

因此,从技术上讲,没有什么可以保证返回的内容可以安全地传递给std::begin.

于 2016-01-28T16:48:09.270 回答
11

正如@Yam Marcovivc 的回答中所指出的,不能保证操作结果是std::valarray<int>可以直接传递给std::begin(). 临时构造的对象可以解决问题:

#include <iostream>
#include <valarray>
int main()
{
        using namespace std;
        valarray<int> numerators = {99, 26, 25};
        valarray<int> denominators = {9, 2, 5};
        for (int i : valarray<int>(numerators / denominators)) { 
            cout <<  i << ","; 
        }
        return 0;
}

看到Live Demo

于 2016-01-28T16:52:15.197 回答
3
    for (int i : (valarray<int> &&)(numerators / denominators)) { cout << i << ","; }
于 2016-01-28T16:50:29.683 回答