在 C++17 中使用 const std::string& 参数有意义吗?
Is there sense in using const std::string& arguments in C++17?
通过在 C++17 中获取string_view
,我们得到了将std::string
和char*
传递给不拥有字符串所有权并避免制作临时副本的函数的廉价方法。通过使用按值和std::move
传递std::string
,我们可以显式快速地传递 r 值和 l 值引用的字符串所有权。
我的问题是:在新C++标准中使用const std::string&
作为任何函数参数有什么好处吗?
是的。
std::string_view
的问题在于它不记得它是否指向以 null 结尾的字符串。
如果要为使用 null 终止字符串的 C API 编写包装器,则必须不断将std::string_view
复制到std::string
s 中,以确保具有 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);
// ...
}
相关文章:
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- <string> 如何在使用 SWIG 时将 int 数组和 List 作为参数传递给 C# C++
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 在 C++17 中使用 const std::string& 参数有意义吗?
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 变量参数列表 后面的'const std::string&'弄乱了堆栈
- 为什么我不能像使用 std::string::size_type 那样使用 QList::size_type?(模板参数错误)
- 在基于 arm 的 Android 设备上使用带有参数 -DCMAKE_BUILD_TYPE:STRING=Releas
- q致命参数:将 QString 转换为常量字符* 会导致警告"format string is not a string literal"
- std::string 参数是如何从原始字符数组文本传递的
- 无法从'std::string'中推断出'const std::reverse_iterator<_RanIt> &'的模板参数
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- "Any value" 对于 'const std::string&' 参数
- 使用 std::string 参数和不可移动/可复制参数构建 std::map
- 生成一个包含int和string参数的向量
- 使用 c++/cli 中的 std::string 参数调用本机 c++ dll
- GetFunctionPointerForDelegate将委托中的String^参数转换成什么?
- 如何允许std:string参数为NULL
- 减少"const char*"和"const std::string&"参数的过载