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
相关产品推荐
相关产品推荐

