繁体   English   中英

强制将字符串文字(const char 数组)衰减到 ptr

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM