如何将 `const std::vector<T*>` 转换为 `std::span<const T*>`

Car*_*son 5 c++ std c++20 std-span

标题。

我正在实现这个类:

#include <span>
#include <vector>

class MyClass {
public:
    std::span<int *> numbers(void) {
        return m_numbers;
    }

    std::span<const int *> cnumbers(void) const {
        // What to do here?
    }

private:
    std::vector<int *> m_numbers;
};
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是使用非常量函数中展示的自动转换(我相信这与 相关std:decay?我不太明白)。

return m_numbers
Run Code Online (Sandbox Code Playgroud)

这无法编译,没有已知的转换。

我发现的一种实现是这样的:

return std::span(m_numbers.begin(), m_numbers.end());
Run Code Online (Sandbox Code Playgroud)

这会返回一个std::span<int * const>,但这并不完全是我想要的。这种使用的变体cbegin似乎没有帮助。

我的目标是 c++20

Evg*_*Evg 8

你试图打破常量正确性。返回std::span<const int *>将允许修改这些元素(指针本身,这不会const)。

正确的返回类型应该是,注意右侧的std::span<const int * const>附加内容。const

  • 也许值得澄清的是,“const int *”意味着指向 const int 的指针。指针本身可以改变,但它指向的值不能改变。而“int * const”表示不能更改为可以更改的 int 的指针。`const int * const` 类型使两个方面都成为 `const`。 (2认同)