Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以从C+中的视图构造“std::span”+;20?_C++_C++20_Std Ranges_Std Span - Fatal编程技术网

C++ 是否可以从C+中的视图构造“std::span”+;20?

C++ 是否可以从C+中的视图构造“std::span”+;20?,c++,c++20,std-ranges,std-span,C++,C++20,Std Ranges,Std Span,此示例程序未编译,因为无法将transform\u视图转换为std::span: class-Foo{ 私人: 向量字符串={a”,“b”,“c”}; 公众: std::span getStrings(){ 返回字符串| std::views::transform([](const std::string&str){return str.c_str();}); } }; int main(){ 富富,; auto strings=foo.getStrings(); 用于(自动s:字符串) 标准:

此示例程序未编译,因为无法将
transform\u视图
转换为
std::span

class-Foo{
私人:
向量字符串={a”,“b”,“c”};
公众:
std::span getStrings(){
返回字符串| std::views::transform([](const std::string&str){return str.c_str();});
}
};
int main(){
富富,;
auto strings=foo.getStrings();
用于(自动s:字符串)
标准::cout
是否可以从C++20中的视图构造
std::span

可以从任何连续范围(适当的基础类型)构造跨度。这里的问题是:

std::span getStrings(){
返回字符串| std::views::transform([](const std::string&str){return str.c_str();});
}
您正在生成的自适应范围不是连续的,它只是随机访问。
span
必须引用在内存中连续的
char const*
s,这里肯定不是这种情况。这就是为什么这不起作用

但这并不意味着任何调整范围都不能转换为
span
。例如,这将起作用:

std::span getStrings(){
返回字符串| std::views::take(5);
}
因为
views::take
可以保持连续性(以
transform
无法实现的方式,原因很清楚)

是否可以从C++20中的视图构造
std::span

可以从任何连续范围(适当的基础类型)构造跨度。这里的问题是:

std::span getStrings(){
返回字符串| std::views::transform([](const std::string&str){return str.c_str();});
}
您正在生成的自适应范围不是连续的,它只是随机访问。
span
必须引用在内存中连续的
char const*
s,这里肯定不是这种情况。这就是为什么这不起作用

但这并不意味着任何调整范围都不能转换为
span
。例如,这将起作用:

std::span getStrings(){
返回字符串| std::views::take(5);
}

因为
views::take
可以保持连续性(以
transform
无法的方式,原因很清楚)。

std::span
是一个指针和大小。它指向数组(或不指向任何地方)。没有
const char*
数组


您也无法从
std::deque
获取
std::span

std::span
是指针和大小。它指向数组(或不指向任何地方)。没有
常量字符*
数组


您也不能从
std::deque
中获取
std::span

No
std::span
不能从任意范围构造。它只是一个在连续范围上的简单轻型查看器。No
std::span
不能从任意范围构造。它只是一个在连续范围上的简单轻型查看器范围。谢谢,这很有意义。但是我问题的第二部分如何?我想能够将视图传递回调用方,但是我的方法实际上是接口的一部分,因此它是虚拟的,我不能执行类似于
constepr auto getStrings()的操作
。在这种情况下,我必须创建并返回数组或向量吗?@Carsten在您的情况下,您可以返回
span
,而无需进行转换(这比
span
更好)。否则,
vector
可能是一个不错的选择。谢谢,我认为
span
在大多数情况下都可以。不过,我需要为一些C API获取
const char*
数组。不过,我认为在这种情况下,我将使用一些转换帮助程序来简化存储指针的
vector
。谢谢!谢谢,这使我的问题的第二部分怎么样?我希望能够将视图传递回调用者,但是我的方法实际上是接口的一部分,因此它是
虚拟的
,我不能执行类似
constepr auto getStrings()的操作
。在这种情况下,我必须创建并返回数组或向量吗?@Carsten在您的情况下,您可以返回
span
,而无需进行转换(这比
span
更好)。否则,
vector
可能是一个不错的选择。谢谢,我认为
span
在大多数情况下都可以。不过,我需要为一些C API获取
const char*
数组。不过,我认为在这种情况下,我将使用一些转换帮助程序来简化存储指针的
vector
。谢谢!