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 に答える
3
    for (int i : (valarray<int> &&)(numerators / denominators)) { cout << i << ","; }
于 2016-01-28T16:50:29.683 に答える