如何将const std::vector<int*>转换为std::span<const int*>?
问题解答:C++20中实现返回
std::span<const int*>的const成员函数 你遇到的核心问题是**const std::vector<int*>隐式转换得到的std::span<int* const>,和你需要的std::span<const int*>是完全不同的类型**,两者无法直接隐式转换。
类型差异说明
先明确几个容易混淆的span类型:
std::span<int*>:元素是可修改的int指针,既可以改指针本身,也可以改指针指向的int值std::span<int* const>:元素是const的int指针(指针本身不能改,但指针指向的int值可以改)——这是你用begin()/end()构造得到的类型std::span<const int*>:元素是指向const int的指针(指针本身可以改,但指针指向的int值不能改)——这是你需要的目标类型std::span<const int* const>:指针本身和指向的int值都不可修改
正确实现方式
要得到std::span<const int*>,需要显式指定span的模板参数,结合vector的data()和size()来构造:
#include <span> #include <vector> class MyClass { public: std::span<int *> numbers(void) { return m_numbers; } std::span<const int *> cnumbers(void) const { // 显式指定span的元素类型为const int*,用data()和size()构造 return std::span<const int*>(m_numbers.data(), m_numbers.size()); } private: std::vector<int *> m_numbers; };
为什么这个写法可行?
在const成员函数中,m_numbers是const std::vector<int*>类型,它的data()成员函数返回int* const(即指向int*的const指针)。而std::span<const int*>的构造函数可以接受这个指针,因为int*可以隐式转换为const int*——这正是你需要的“指针指向的内容不可修改”的语义。
为什么之前的尝试失败?
- 直接返回
m_numbers:const vector只能隐式转换成std::span<int* const>,无法自动转换成std::span<const int*>,因为两者的const修饰位置完全不同(前者修饰指针本身,后者修饰指针指向的内容)。 - 用
begin()/end()构造:const vector的迭代器指向的元素是int* const,所以构造出的span元素类型就是int* const,不符合你的需求。
内容的提问来源于stack exchange,提问作者Carson
相关产品推荐
相关产品推荐

