【问题标题】:Is it a bug of the implementation of std::valarray in gcc?它是在 gcc 中实现 std::valarray 的错误吗?
【发布时间】:2020-01-25 22:08:26
【问题描述】:

我尝试了以下程序

#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&lt;int&gt;operator * 声明如下

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

那么是std::valarray&lt;int&gt;的实现的bug吗?

【问题讨论】:

  • 如果将auto v3 = ... 替换为std::valarray&lt;int&gt; v3 = ...,代码将按预期编译和运行。通过使用autov3 是一些中间表达式模板生成的类型。
  • valarray 上的操作员被允许返回代理对象,这使得实现可以将多个操作(如 a * b + c)优化到一个循环中。不知道代理对象是否需要实现begin()end()
  • eel.is/c++draft/valarray.syn#3.sentence-1,这意味着你不能使用auto,并且对它有你正在测试的期望。

标签: c++ gcc operator-overloading c++20 valarray


【解决方案1】:

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

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

强调我的source

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2012-01-18
    • 2013-05-04
    • 2012-12-17
    • 2017-02-24
    • 2017-06-04
    • 2012-07-02
    • 2012-07-21
    相关资源
    最近更新 更多