是否可以在编译时判断一个string_view是否指向一个字符串字面量?

编程语言 2026-07-11

我想返回一个视图的子视图,同时尽量避免分配新的字符串。 因此如果输入的视图引用的是一个字符串字面量,我可以返回一个 std::string_view,否则我必须返回一个 std::string

constexpr auto process(std::string_view input)
{
    std::string_view result;
    ...
    // results is now a sub-string-view of input
    if constexpr ("input is referring to a string literal")
    {
        return result;
    }
    else
    {
        return std::string(results);
    }
}

沙盒

编译期检查是否可行?如果可行,怎么实现?

如果函数在运行时被调用并传入其他参数(例如在string_view中给定的运行时位置),这会带来什么变化?

注:首选使用C++20的解法,但如果不可行,也可提供适用于更高标准的解法以供参考。

解决方案

我觉得没有办法判断指针的“起源/生命周期”。

不过你可以为编译期和运行时各自提供一个重载:

#include <iostream>
#include <string>
#include <string_view>

template <std::size_t N>
struct LiteralString
{
    consteval LiteralString(const char (&s)[N]) { std::copy(s, s + N, &data[0]); }

    constexpr operator std::string_view() const { return {data, data + N}; }

    static constexpr std::size_t size = N;
    char data[N]{};
};

template <LiteralString input>
constexpr std::string_view process() {
    return input;
}

std::string process(std::string_view input) {
    return std::string(input);
}

int main() {
    std::cout << process<"string0">() << '\n';
    std::cout << process("string1") << '\n';
}

演示

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章