在 C++17 中使用 const std::string& 参数有意义吗?

Is there sense in using const std::string& arguments in C++17?

本文关键字:string 参数 有意义 std C++17 const      更新时间:2023-10-16

通过在 C++17 中获取string_view,我们得到了将std::stringchar*传递给不拥有字符串所有权并避免制作临时副本的函数的廉价方法。通过使用按值和std::move传递std::string,我们可以显式快速地传递 r 值和 l 值引用的字符串所有权。

我的问题是:在新C++标准中使用const std::string&作为任何函数参数有什么好处吗?

是的。

std::string_view的问题在于它不记得它是否指向以 null 结尾的字符串。

如果要为使用 null 终止字符串的 C API 编写包装器,则必须不断将std::string_view复制到std::strings 中,以确保具有 null 终止符。

我知道这个问题是关于C++17的,但是在C++20中,我认为您最终可以通过使用C++20的概念来避免使用std::string&参数。

您可以编写一个概念,要求参数类型可转换为std::string_view,也可以转换为const char*std::string,因此以 NULL 结尾。然后,您可以将参数转换为函数体中的string_view,并且可以在 C API 中安全地使用该string_view,而无需执行运行时检查。

这是我维护的一个小 libcurl 包装器的示例:

// NULL-terminated std::string_view
template<typename T>
concept Text = std::convertible_to<T, std::string_view> && (std::convertible_to<T, std::string> || std::convertible_to<T, const char*>);
void get(const std::string_view url, const Text auto... headers) noexcept {
// ...
struct curl_slist* curl_headers {nullptr};
if constexpr (sizeof...(headers) != 0) {
const std::array header_array {static_cast<std::string_view>(headers)...};
for (const std::string_view header : header_array) {
curl_headers = curl_slist_append(curl_headers, header.data());
}
}
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_headers);
// ...
}
相关文章: