c++ - 从 initializer_list 构造 string_views 的向量
问题描述
我正在尝试从一个在 GCC 9 上运行良好的 a vector
of string_view
s构建一个,但是在更新到 GCC 10 之后它在运行时崩溃。initializer_list< const char * >
#include <vector>
#include <string_view>
#include <cstdio>
int main()
{
std::vector< std::string_view > const v { { "Before.", "Afterrrrrr." } };
printf( "%s %zu\n", v[0].data(), v[0].length() );
printf( "%s %zu\n", v[1].data(), v[1].length() );
return 0;
}
Clang 还可以处理代码,什么给出?
解决方案
在这个变量定义中
std::vector< std::string_view > const v { { "Before.", "Afterrrrrr." } };
你不小心使用了这个新的 C++20string_view
构造函数:
template<class It, class End>
constexpr basic_string_view(It first, End last);
因此,您只需使用 start of
作为结束迭代器来构造一个。 这使得程序具有未定义的行为。string_view
"Afterrrrrr."
这将是正确的方法:
std::vector< std::string_view > const v { "Before.", "Afterrrrrr." };
推荐阅读
- system-verilog - Systemverilog 跨层次边界的接口
- node.js - 我可以将 vscode 扩展从现有发布者迁移到新发布者吗?
- docker - 在 pod 触发 kubectl exec 命令后,如何查找以退出代码 137 错误终止的命令的日志
- r - 抑制多个包/库加载消息
- python - 或熊猫系列的关键字
- arrays - 如何将可变数组划分为可变子数组
- java - 反向排序流
- http - 根本不需要 HTTPS,但似乎没有其他方法可以从网络浏览器
- cordova - 使用 Cordova 在 Web 应用程序中包装网页
- xml - 字符串中的 XSL 转换新行分隔符问题