基于 C++ 范围的 for 循环在 valarray 右值上不起作用
C++ range-based for loop over valarray rvalue is not working
我想迭代一个临时的 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)
和 for (int const & i : temp_array)
,但它不起作用。
来自文档(其中还包括在单个表达式中执行此操作的官方方法):
Unlike other functions that take std::valarray arguments, begin() cannot accept the replacement types (such as the types produced by expression templates) that may be returned from expressions involving valarrays: std::begin(v1 + v2) is not portable, std::begin(std::valarray(v1 + v2)) has to be used instead.
The intent of this function is to allow range for loops to work with valarrays, not to provide container semantics.
至于可能是什么原因,还有这个(@chris指出):
[arithmetic operators] can be implemented with the return type different from std::valarray.
所以在技术上没有任何东西可以保证 returns 可以安全地传递给 std::begin
。
for (int i : (valarray<int> &&)(numerators / denominators)) { cout << i << ","; }
正如 中指出的那样,操作结果不能保证是可以直接传递给 std::begin()
的 std::valarray<int>
。临时构造的对象可以解决问题:
#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
我想迭代一个临时的 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)
和 for (int const & i : temp_array)
,但它不起作用。
来自文档(其中还包括在单个表达式中执行此操作的官方方法):
Unlike other functions that take std::valarray arguments, begin() cannot accept the replacement types (such as the types produced by expression templates) that may be returned from expressions involving valarrays: std::begin(v1 + v2) is not portable, std::begin(std::valarray(v1 + v2)) has to be used instead.
The intent of this function is to allow range for loops to work with valarrays, not to provide container semantics.
至于可能是什么原因,还有这个(@chris指出):
[arithmetic operators] can be implemented with the return type different from std::valarray.
所以在技术上没有任何东西可以保证 returns 可以安全地传递给 std::begin
。
for (int i : (valarray<int> &&)(numerators / denominators)) { cout << i << ","; }
正如 std::begin()
的 std::valarray<int>
。临时构造的对象可以解决问题:
#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