【问题标题】:array<double*> to vector<double> range v3 style on VS2019VS2019 上的 array<double*> 到 vector<double> 范围 v3 样式
【发布时间】:2021-01-05 04:10:37
【问题描述】:

我想将array&lt;double*&gt; 转换为vector&lt;double&gt;,以便我可以对两个相同类型的向量执行ranges::views::concat,但我很难做到这一点。

我有以下代码:

#include <range/v3/all.hpp>

#include <array>

static constexpr auto max_elements = 2000;

struct PriceInfo
{
    std::array<double*, max_elements> prices;
};

auto main() -> int
{
    const PriceInfo* const buf_prices = nullptr;
    const auto vec = buf_prices->prices 
                   | ranges::views::indirect 
                   | ranges::to_vector;
}

当我编译时出现以下错误,我不明白为什么,因为我相信我的代码是正确的,至少它在 gcc 下编译没有错误。

错误(激活) E0349 没有操作符“|”匹配这些操作数

请问我该如何解决这个错误?

【问题讨论】:

  • 首先,您在此处取消引用nullptr (buf_prices)。这是 UB。
  • nullptr 作为地点标记和测试存在。假设一个正确格式的指针数组。
  • 这里是神螺栓游戏区:godbolt.org/z/MezYh1
  • 这是另一个正确的数组初始化:godbolt.org/z/3G1oTT
  • @Andrew 它仍然是 ub...您取消引用非易失性 nullptr 并写入不存在的对象。编译器允许跳过或做任何事情

标签: c++17 range-v3


【解决方案1】:

首先,您的代码包含 UB,因为您从未创建过 PriceInfo。 其次,错误可能意味着项目配置不正确,是标准设置吗?编译器是否完全兼容库的要求?如果是这种情况,它是否是库的正确分支(例如,MSVC 编译器有单独的分支)。 第三,假设这些问题将得到解决,除非所有价格元素都是非空指针,否则此代码将出现段错误。

这样就可以了:

#include <range/v3/all.hpp>
#include <iostream>
#include <array>

static constexpr auto max_elements = 3; //  will segfault if there are null pointers

struct PriceInfo
{
    std::array<double*, max_elements> prices;
};

auto main() -> int
{
    auto a = std::array<double,3>{1.0, 2.0, 3.0};
    const PriceInfo* const buf = new PriceInfo{&a[0],  &a[1],  &a[2]};
    
    const auto vec = buf->prices 
                   | ranges::views::indirect 
                   | ranges::to_vector;
                   
    for( auto a : vec)
        std::cout << a << "\n";
}

【讨论】:

  • 这是你的代码的一个神螺栓,它在 msvc2019 上失败了:godbolt.org/z/jbczf8
  • @Andrew 将“views”更改为“view”(godbolt.org/z/xaMqj9)后成功。 MSVC 编译器资源管理器虚拟机似乎使用的是 range-v3 的古老版本。
  • @casey 它正在使用 vcpkg 安装,我使用的是相同的,所以我假设我有同样的问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多