[英]Force decay of string literals (const char array) to ptr
在下面的示例中,我尝试将emplace_back()
字符串文字和string_view
放入std::pair
of string_views
中。 但是,我的问题是emplace_back()
将字符串文字作为 const char 数组使用,并且不会将其衰减为指针。 结果是emplace_back()
找不到std::string_view
的 const char* 构造函数。 我如何手动衰减字符串文字作为 function arguments 的一部分(被通用引用积极吞噬)?
#include <utility>
#include <vector>
#include <string>
#include <string_view>
#include <cstdio>
struct A
{
std::string_view vsn_ = "0.0.1";
std::string_view key_;
};
auto get_url(A params = {})
{
std::vector<std::pair<const char*, std::string_view>> queries;
if (!params.key_.empty()) {
queries.emplace_back(std::piecewise_construct, ("key="), params.key_);
}
if (!params.key_.empty()) {
queries.emplace_back(std::piecewise_construct, ("VSN="), params.vsn_);
}
std::string url;
for (auto q : queries) {
url += q.first;
url += q.second.data();
}
return url;
}
int main()
{
printf("%s", get_url().data());
}
(如您所见,我已经尝试在字符串文字周围加上括号,但无济于事)
std::piecewise_construct
构造函数(正如您在此处尝试用于std::pair
构造的那样)期望 arguments 的 rest 为std::tuple
,每个元组持有 arguments 以构造其中一个片段(例如 pair元素)。
您没有将元组作为第二个和第三个参数传递,因此它无法工作。 它应该是
queries.emplace_back(std::piecewise_construct,
std::forward_as_tuple("key="),
std::forward_as_tuple(params.key_));
但是,如果您只想从一个参数构造每一对元素,则不需要分段构造函数。 std::pair
有一个专门用于此的构造函数:
queries.emplace_back("key=", params.key_);
这些都与数组是否衰减为指针无关。 (它会在需要的地方衰减,不需要人工干预。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.