You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ const数组无法转换为std::span,如何让函数支持接收constexpr数组

问题原因

核心是std::span的元素常量限定符不匹配:

  • 你传入的TexturedVertex2D::attribs是const VertexAttrib[2]类型,元素为只读常量
  • 函数形参std::span<VertexAttrib>指代的是可修改的VertexAttrib元素序列,常量数组无法直接转换为该类型,因此编译器报错。

解决方法

直接修改init函数的第四个参数类型,给std::span的元素加上const限定符即可:

// 修改前
// void init(size_t size, const void *data, GLenum usage, std::span<VertexAttrib> attribs) const

// 修改后
void init(size_t size, const void *data, GLenum usage, std::span<const VertexAttrib> attribs) const

从你的代码定义来看,attribs是静态常量顶点属性表,本身不需要被修改,给元素加const也符合常量正确性的设计要求。

可选扩展(支持内联临时数组传参)

如果需要支持直接传入内联构造的临时数组,可以新增一个模板重载:

template<size_t N>
void init(size_t size, const void *data, GLenum usage, const VertexAttrib (&attribs)[N]) const {
    init(size, data, usage, std::span<const VertexAttrib, N>(attribs));
}

添加后你可以直接这样调用,不需要额外定义静态常量数组:

_vertices.init(..., {{2,VertexAttribType::Float}, {2,VertexAttribType::Float}});

内容的提问来源于stack exchange,提问作者mpen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:15:08