std::valarray 的运算符* 有什么问题?

2024-04-21

考虑以下 MCVE,其中我有两个值数组,其中w是两次v (在这里尝试一下 https://godbolt.org/z/JkXPNN):

#include <valarray>

using namespace std;

int main() {
  valarray<int> v { 1, 2, 3 };

  for ([[maybe_unused]] auto x : v) {} // Ok

  auto w = v * 2;     // Leads to failure in loop below
  //valarray<int> w = v * 2; // Works
  //auto w = v*=2;      // Works
  //auto w = v; w *= 2; // Works

  for ([[maybe_unused]] auto x : w) {} // Failure here
}

此示例无法在最后一个循环中使用 clang 和 gcc 进行编译(此处为 gcc 输出):

error: no matching function for call to 'begin(std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_ValArray, std::_Constant, int, int>, int>&)'

问题的根源似乎是 dedeced 类型v * 2(我认为因为显式写下类型是有效的,所以似乎正在发生一些隐式转换)。

看着参考笔记 https://en.cppreference.com/w/cpp/numeric/valarray/operator_arith3#Note, 看起来operator*可能会返回不同于std::valarray<T>。 我不明白其中的原因,但更令人费解的是这似乎同样适用于operator*= https://en.cppreference.com/w/cpp/numeric/valarray/operator_arith2#Notes,除了这里我的auto作业作品。我期望的返回值是operator*= and operator*此处相同(增量参考)。

所以我的问题是:

  • 这是一个实施问题/错误吗?或者我错过了什么?
  • 背后的理由是什么参考笔记 https://en.cppreference.com/w/cpp/numeric/valarray/operator_arith3#Note(例如,为什么操作员可以返回一些不同的东西,这些东西可能不适用于std::begin/std::end)?

(注:我将此问题标记为 c++11,但它似乎也适用于 17 之前的所有版本)


有一个称为表达式模板的技巧,它可以提高复合表达式的效率,但在使用时会严重破坏auto.

改变这个:

auto w = v * 2;

to this:

std::valarray<int> w = v * 2;

并且你的代码可以工作。


要了解为什么我们要使用表达式模板,请尝试以下操作:

std::valarray<int> a={1,2,3},b{4,5,6},c={2,4,8};
std::valarray<int> r = (a+b*2)*c;

这里的表达式模板避免创建临时 valarraya+b*2 or b*2,而是将整个表达式向下传递,并构造r与逐元素操作。

没有创建 3 元素 valarray 临时变量(a+b*2)*c-- 只是一系列描述表达式结构和参数的对象。当分配给实际的valarray然后逐个元素地计算表达式。

But auto不转换为valarray;它只存储表达式模板对象。所以你的代码坏了。

我不知道哪个版本的标准允许这样做;不管怎样,一些 valarray 实现使用了它,并且它增加了很多效率。没有它,valarray 坦率地说很糟糕。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::valarray 的运算符* 有什么问题? 的相关文章

随机推荐

  • BigQuery更新如何获取更新的行数

    我正在使用 Google Cloud Functions 连接到 Google Bigquery 数据库并更新一些行 云函数是使用Python 3编写的 当我通过函数运行更新 dml 时 我需要帮助弄清楚如何获取结果消息或更新 更改的行数
  • dplyr 0.3 无法inner_join data.table?

    我有以下设置并加载了 dplyr 0 3 和 data table 1 9 3 R version 3 1 1 2014 07 10 Platform x86 64 apple darwin10 8 0 64 bit locale 1 en
  • 是否可以直接从文件加载镶木地板表?

    如果我有一个二进制数据文件 可以转换为 csv 格式 有什么方法可以直接从中加载镶木地板表吗 许多教程显示将 csv 文件加载到文本表 然后从文本表加载到镶木地板表 从效率的角度来看 是否可以像我已有的那样直接从二进制文件加载镶木地板表 理
  • Android html5 输入 type="password" 和数字键盘

    我的任务是为 Android 和 iOS 设计一个网页 您应该在其中输入您的信用卡信息 我无法获取在 Android 中打开数字键盘的安全代码字段 这是我距离最近的一次 它适用于 iOS 但不适用于 Android
  • 用三种颜色的渐变填充面板

    我正在做一个项目 我必须使用 C 做一种颜色选择器 所以我决定在 Win Forms 应用程序中建立一个具有此背景的面板 背景应具有 RGB 三种颜色的渐变 红色 0 255 蓝色 0 255 和绿色 0 但我找不到任何关于我应该为此使用什
  • 模板组件启动器内的离子标签组件未渲染

    我克隆了stencil component starter from https github com ionic team stencil component starter https github com ionic team ste
  • Android 上未原生找到 RNFirebase 核心模块

    我正在尝试在 Android 平台上运行现有的 React Native 应用程序 但收到如下图所示的错误 我已经执行了下面提到的所有步骤http invertase link android http invertase link and
  • Ionic2 - 如果超时则取消 Api 请求

    在我的应用程序中 我通过表单保存数据并调用 Api 进行相同的操作 为了检查它们的互联网连接是否缓慢 我在 ionic2 中使用超时 如下所示 savedata let headers new Headers headers set Con
  • 创建较慢的过渡。 TransitionManager.beginDelayedTransition();太快了

    我正在创建一个过渡 当单击按钮时 将执行以下方法 该方法改变了图像视图的大小和位置 并将其淡出 我在用TransitionManager beginDelayedTransition is too fast 放慢转变速度 但它仍然进展得太快
  • 为动态图像生成 CSS 精灵

    我有一个网页 其中包含大约 20 50 个动态图像 从非静态源提供的图像 这些图像通过基于请求 URL 的 servlet 提供 这会导致每个图像生成一个请求 从而导致性能下降 如果这些图像是静态的 我将创建一个 CSS 精灵并用一个请求替
  • 直线和水平线在断点处连接的分段回归

    我想做一个带有一个断点的分段线性回归 其中回归线的第二半有slope 0 有一些关于如何进行分段线性回归的示例 例如here https stackoverflow com questions 15874214 piecewise func
  • 如果我在 grails 中使用 groovy sql 类,它是否使用 grails 连接池?

    来自 sql 文档中的以下示例 如果我使用这两种方法之一在 Grails 服务类中创建 sql 实例 它会使用 Grails 连接池吗 它会参与任何交易功能吗 我需要自己关闭连接吗 还是会自动回到池子里 def db url jdbc hs
  • 如何在C中将RGB转换为HSL?

    如何在 C C 中将 RGB 转换为 HSL Note This is a short self answer I posted it here so people can find it quickly with a search 翻译代
  • 我可以在 asp.net 4.0 站点中托管 .net 2.0 虚拟目录吗?

    我们在 2 0 网站中运行 NET 4 0 虚拟目录没有任何问题 但相反的方式却给我们带来了一些问题 这是可以理解的 但是有没有办法解决这个问题呢 它们使用不同的应用程序池运行 我们可以让虚拟目录跳过网站的 web config 并直接转到
  • 从提升的进程正常执行进程

    是否有某种方法可以从提升的方式以非提升的方式启动流程 我的设置以提升的方式启动 当它完成时 它只会启动主应用程序 由于设置被提升 主进程也会被提升 这是不可取的 对此最好的解决方案是什么 这是一个问题 Vista Win7 似乎没有 API
  • Horizo​​ntalScrollView:带有 getView() 的 CustomAdapter 不会像 ListView 那样重用 ConvertViews

    在我过去的一个项目中 我实现了 时间选择器轮播 它基于一个HorizontalScrollView 用户可以在滚动该视图时选择时间 时间值是根据 X 偏移计算的HorizontalScrollView 我想在 github 上分享这个项目
  • 为什么我在访问最终局部变量时会出现 Java 中的 InstantiationException?

    我正在玩一些代码来制作 类似闭包 的构造 顺便说一句 不起作用 一切看起来都很好 但是当我尝试访问代码中的最终局部变量时 出现异常InstantiationException被抛出 如果我通过完全删除局部变量或使其成为类属性来删除对局部变量
  • 修复 iOS7 上主体背景随页面滚动的问题

    我使用以下 CSS 来创建固定的主体背景 除了新的 iOS7 之外 它几乎可以在所有浏览器上运行良好 后者的背景不再固定 它随页面滚动 知道如何解决这个问题吗 body background color 000 background ima
  • Coldfusion SQL 插入循环

    遇到一个问题 我想我可以看看是否有人对如何解决它有任何想法 基本上 我在单个变量下传递多个值 并且我想使用循环来提取每个单独的值并同时插入它 例如 ischecked 是我用来传入设备值的变量 如果我要选择两个设备 按提交并将变量 form
  • std::valarray 的运算符* 有什么问题?

    考虑以下 MCVE 其中我有两个值数组 其中w是两次v 在这里尝试一下 https godbolt org z JkXPNN include