c++ - 任何用 constexpr string_view 替换全局 const char[] 的陷阱?
问题描述
我们的团队正在使用 10 多年的 C++ 代码库,最近切换到 C++17 编译器。所以我们正在寻找使我们的代码现代化的方法。在 YouTube 上的一次会议演讲中,我听到了将const char*
全局字符串替换为constexpr string_view
.
由于我们的代码中有很多这样的const char*
全局字符串常量,我想问一下是否有任何我们需要注意的问题或潜在问题?
解决方案
这些问题可能值得关注:
std::string_view
不需要被null
终止。因此,如果您将 someconst char*
bystring_view
替换为 via 并将先前null
终止char*
的子字符串的构造替换为string_view
viastd::string_view::substr
,则无法将底层指针传递给需要 -null
终止字符串的 API。示例(没有 UB,但这也很容易构建):void legacy(const char *str) { std::printf("%s\n", str); } constexpr std::string_view sv1 = "abcde"; constexpr std::string_view sv2 = sv1.substr(0, 2); // view on "ab" legacy(sv2.data()); // Not intended: prints "abcde"
std::string
虽然你可以从 a隐式构造 aconst char*
,但你不能用 a 来做到这一点std::string_view
。这个想法是,深层副本不应该在掩护下发生,而只有在明确要求时才发生。例子:std::map<std::string, int> m; constexpr std::string_view sv = "somekey"; constexpr const char *old = "somekey"; m[old] = 42; // works as expected m[sv] = 42; // fails to compile m[std::string(sv)] = 42; // be explicit, this is ok
根据
const char*
项目中全局实例的现有使用情况,此行为可能需要在不同位置进行手动干预。
推荐阅读
- haproxy - HAProxy: change backend as path?
- sql - 通过与前两个相关但 id 不同的第三个关系表连接两个表
- java - 如何确定我自己项目中给定依赖项的测试覆盖率?
- python - 使用rest api更新汇合页表时出错
- css - z-index 不起作用
- sql - 可以在其中执行原因的具有不存在列的 SQL
- python - python PIL 或 pyautogui.screeshot("photo.png",region=(xx,yy,zz)) 错误
- javascript - 无法获取未定义
- python - 在 Python 中循环保存图像
- android - 如何从 Android webrtc 获取麦克风的振幅?