这是在gcc中实现std :: valarray的错误吗?

Vla*_*cow 4 c++ gcc operator-overloading valarray c++20

我尝试了以下程序

#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;
}
Run Code Online (Sandbox Code Playgroud)

并得到了一条错误消息,适当的函数begin用于v3本声明隐含使用

    for ( const auto &item : v3 ) std::cout << item << ' ';
Run Code Online (Sandbox Code Playgroud)

找不到。

所以我尝试了以下代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

得到了结果

0
Run Code Online (Sandbox Code Playgroud)

但是当这句话

auto v3 = v1 * v2;
Run Code Online (Sandbox Code Playgroud)

更改为

std::valarray<int> v3 = v1 * v2;
Run Code Online (Sandbox Code Playgroud)

那么输出是

1
Run Code Online (Sandbox Code Playgroud)

operator *std::valarray<int>声明如下方式

template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&);
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ica 5

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

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

重点矿

因此,您需要明确地将返回值捕获为,std::valarray以便std::begin可以调用的专门化。