我尝试了以下程序
#include <iostream>
#include <valarray>
int main( void )
{
std::valarray<int> v1 = { 1, 2, 3, 4, 5 };
std::valarray<int> v2 = { 1, 2, 3, 4, 5 };
auto v3 = v1 * v2;
for ( const auto &item : v3 ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
我得到了一个错误消息,该语句中隐式使用了v3
的适当函数begin
for ( const auto &item : v3 ) std::cout << item << ' ';
无法找到。
因此,我尝试了以下代码
#include <iostream>
#include <valarray>
#include <type_traits>
int main( void )
{
std::valarray<int> v1 = { 1, 2, 3, 4, 5 };
std::valarray<int> v2 = { 1, 2, 3, 4, 5 };
auto v3 = v1 * v2;
std::cout << std::is_same<std::valarray<int>, decltype( v3 )>::value << '\n';
return 0;
}
并获得了结果。
0
但是,当这个声明
auto v3 = v1 * v2;
被更改为
std::valarray<int> v3 = v1 * v2;
那么输出结果是:
1
std::valarray<int>
的 operator *
声明如下
template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&);
那么这是
std::valarray<int>
实现的一个 bug 吗?
auto v3 = ...
替换为std::valarray<int> v3 = ...
,则代码将按预期编译和运行。通过使用auto
,v3
是一些中间表达式模板生成的类型。 - Praetorianvalarray
上的运算符允许返回代理对象,这使得实现可以将多个操作(如a * b + c
)优化为单个循环。我不知道代理对象是否需要实现begin()
和end()
。 - interjay