4

我尝试了以下程序

#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;
}

并收到一条错误消息,表明在此语句中隐式使用begin了适当的函数v3

    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

foroperator *声明std::valarray<int>如下

template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&);

那么这是实现的错误std::valarray<int>吗?

4

1 回答 1

5

这不是错误。 std::valarray::operator*实际上不必返回 astd::valarray因为它允许使用表达式模板。这意味着它可以返回具有以下属性的类型:

  • 提供了所有的 const 成员函数std::valarray
  • std::valarray, std::slice_array, std::gslice_array,std::mask_arraystd::indirect_array可以从替换类型构造。
  • 所有接受const std::valarray&begin()and类型参数的函数end()(C++11 起)也应该接受替换类型
  • 所有接受两个类型参数的函数const std::valarray&都应该接受const std::valarray&和 替换类型的每个组合。
  • 返回类型不会在嵌套最深的参数类型上添加超过两层的模板嵌套。

强调矿

因此,您需要将返回显式捕获为 a std::valarray,以便std::begin可以调用 for 的特化。

于 2019-09-25T16:51:32.767 回答