【问题标题】:Is it safe to return a static string_view created from a string literal?返回从字符串文字创建的静态 string_view 是否安全?
【发布时间】:2020-06-04 10:58:28
【问题描述】:

我有一个相对简单的用例:我想将一个特征关联到一个类,该类将返回一些用户定义的字符串,即一些用户定义的注册 ID。由于这个注册应该在编译时定义,我希望它是 constexpr 所以我写了如下内容:

template <typename T>
struct ClassRegistration
{
    static constexpr std::string_view
    Name();
};

template <>                                                                                    
struct ClassRegistration<int>                                                            
{                                                                                              
    static constexpr std::string_view                                                        
    Name()                                                                                     
    {                                                                                          
        return std::string_view{ "int" };                                                     
    }                                                                                          
};

https://godbolt.org/z/5p8xkA

一切正常,但由于 string_view 实际上并不拥有它的缓冲区,我想知道它是否可以保证是安全的,我不只是指一个悬空指针。从我读到的字符串文字保证与程序本身的生命周期一样长(来自这个 SO Lifetime of a string literal returned by a function)。

因此,string_view 的这种用法是否安全合适?

【问题讨论】:

  • @NoSenseEtAl static constexpr 类范围内的变量是隐式的 inline,所以它不应该在这里应用。
  • @HolyBlackCat 我知道,但我知道链接对于不知道的人来说可能会造成混淆......
  • 谢谢@NoSenseEtAl,幸运的是那部分已经很清楚了

标签: c++ c++17 constexpr string-literals string-view


【解决方案1】:

保证字符串字面量的生命周期与程序本身的生命周期一样长

没错。

因此,string_view 的这种用法安全且适当吗?

是的,你的代码没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多