前言
给定一个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 Bolas的answer和HarryLeong的评论。
它应该有显式的构造函数,我的最终解决方案是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。
1条答案
按热度按时间sc4hvdpw1#
span
被明确地设计成不允许这样做。如果你使用的span
具有编译时固定的大小,那么当你试图创建一个类型时,你必须拼写出这个固定的大小。这样,即使你传递了length
,每个人都非常清楚实际的大小是什么。