我简单地使用遍历范围for for循环中的临时std::valarray
表达式,但得到 error
:无效范围表达式...
的main.cpp
#include <iostream>
#include <valarray>
int main()
{
std::valarray<int> xxx {2,7,1,8,2,8};
std::valarray<int> zzz {xxx};
for (auto x : xxx + zzz) std::cout << x << std::endl;
return 0;
}
clang ++ main.cpp -std = c ++ 11
main.cpp:10:17: error: invalid range expression of type 'std::__1::__val_expr<std::__1::_BinaryOp<std::__1::plus<int>, std::__1::valarray<int>, std::__1::valarray<int> > >'; no viable 'begin' function available
for (auto x : xxx + zzz) std::cout << x << std::endl;
^ ~~~
它是否真的有理由不按我的预期进行编译?
重载operator+
的返回类型为valarray<T>
,因此从理论上讲,表达式的值应该是valarray<T>
类型的临时实例。
梗概:
template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
版本: Apple LLVM 8.0.0版(clang-800.0.38)目标:x86_64-apple-darwin15.6.0
注意以下行工作
for (auto x : xxx += zzz) std::cout << x << std::end;
答案 0 :(得分:1)
作为&#34;开始&#34;和&#34;结束&#34;可用于operator+
返回类型,即valarray<T>
我说错误是错误的,应该编译。
答案 1 :(得分:0)
你想做什么? 如果你想遍历xxx只在其中执行:
for (const auto x : xxx) std::cout << x << std::endl;
但是回答你问题的基础知识,表达式(xxx + yyy)是不可迭代的。如果你想在两者中都进行for循环,你可以做两个:
for (auto x : xxx) std::cout << x << std::endl;
for (auto x : zzz) std::cout << x << std::endl;
如果你想在一个循环中完成,你可以附加两个
xxx += yyy;
for (auto x : xxx) std::cout << x << std::endl;
来自编辑的PD:行
for (auto x : xxx += yyy) std::cout << x << std::endl;
有效,因为它首先进行追加然后迭代。相当于我的最后一个建议。但是(xxx + yyy)不可迭代。
从您的评论中: valrray :: operator +(valarray)不存在。 valrray :: operator + =(valarray)确实存在。
答案 2 :(得分:0)
循环范围使用非成员std :: begin和std :: end,对于std :: valarray,operator +的返回类型不需要存在。
可移植语法
for(auto x : std::valarray<int>(xxx + zzz))
在cppreference和26.7.1 [valarray.syn] p4.1下的标准中注明了这一点
答案 3 :(得分:0)
这是一个非常好的问题。原因是A + B在valarray上的行为。
让我们明白我的意思。
首先,尝试以下几行。
std::valarray<int> xxx {2,7,1,8,2,8};
std::valarray<int> zzz {xxx};
auto t=xxx+zzz;
cout<<typeid(t).name()<<endl;
cout<<typeid(xxx).name()<<endl;
cout<<typeid(xxx+zzz).name()<<endl;
您会发现它们并不相同,这是由于在https://en.cppreference.com/w/cpp/numeric/valarray/operator_arith3中+运算符的定义 在编写时,推断出类型。这意味着它的行为类似于auto。然后的问题是,为什么它不能推断出相同的类型valarray。可能是由于编译器优化功能引起的,或者可能是错误的,但是很明显,该引用不会强制编译器推断出相同的类型。问题是推导类型恰巧不能被基于for循环的范围所迭代。
请让我知道是否有任何不清楚的地方。