У меня есть простое использование обхода временного std::valarray
выражения в диапазоне для цикла, но получило error
: выражение недопустимого диапазона ...Недопустимого выражения диапазона станд :: valarray в диапазоне для цикла
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;
}
лязг ++ 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 (лязг-800.0.38) Цель: x86_64-яблочно-darwin15.6.0
Примечание следующая строка работы
for (auto x : xxx += zzz) std::cout << x << std::end;
Да, поскольку 'valarray' использует шаблоны выражений. –
VS2013 компилирует его без ошибок. – acraig5075
@ acraig5075 Хорошая точка. Я также просто проверил на http://rextester.com/l/cpp_online_compiler_visual –