c++ 从“{指针,长度}”构造std::span的静态范围

gojuced7  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(79)

前言

给定一个char *p指针指向一个具有给定size_t length的缓冲区。调用者将保证该缓冲区有效。
我想使用void spanStatic(std::span<char,8> s)修改缓冲区。我尝试使用spanStatic({p, length}),其中length大于8。编译失败。我推测编译器可能无法将初始值设定项列表推导为span<char,8> ...但使用span<char,dynamic_extent>
注意:我倾向于使用静态扩展区,因为我想修改的长度是在编译时决定的,这个问题也可能在编译时发现。

问题:

有没有比使用spanStatic(std::span<char, 8>(p, length))更快捷的方法来构建临时跨?
Live demo

#include <fmt/format.h>
#include <span>

constexpr const char MAGIC_PATTERN[] = "\xBA""\xAD""\xF0""\x0D""\xDE""\xAD""\xBE""\xEF";
constexpr static size_t LEN = sizeof(MAGIC_PATTERN) - 1;

constexpr static std::span<const char, LEN> magic(MAGIC_PATTERN, LEN);

void spanDynamic(std::span<char> s){
    std::copy(magic.begin(), magic.end(), s.begin());
}
void spanStatic(std::span<char,LEN> s){
    std::copy(magic.begin(), magic.end(), s.begin());
}
int main()
{
    char data[] = "hello world";

    // Mimic a valid pointer + length, where length must be larger than LEN
    char* p = data;
    spanDynamic({p, LEN});
    // spanStatic({p, LEN}); // <--failed
}

编辑:

感谢Nicol BolasanswerHarryLeong的评论。
它应该有显式的构造函数,我的最终解决方案是using MySpan = std::span<char, 8>
这个问题与Why can't I construct a gsl::span with a brace-enclosed initializer list不同,Why can't I construct a gsl::span with a brace-enclosed initializer list将临时std::array构造为span。

sc4hvdpw

sc4hvdpw1#

span被明确地设计成不允许这样做。如果你使用的span具有编译时固定的大小,那么当你试图创建一个类型时,你必须拼写出这个固定的大小。这样,即使你传递了length,每个人都非常清楚实际的大小是什么。

相关问题