Answers:
这些问题可能值得注意:
std::string_view
不需要null
终止。因此,如果您用const char*
by string_view
代替并用via 代替了以前null
终止的char*
子字符串的构造,则无法将基础指针传递给期望以终止的字符串的API 。示例(没有UB,但也很容易构造):string_view
std::string_view::substr
null
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 隐式构造a const 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*
项目中全局实例的现有用法,此行为可能需要在各个位置进行手动干预。
someLegacyFct(std::string(sv).c_str())
const char*
构造函数。所以std::string
from的显式构造string_view
在我们的情况下将是一致的。
std::string(sv).c_str()
代替传递给API吗?