Безопасно ли возвращать статический string_view, созданный из строкового литерала?

У меня относительно простой вариант использования: я хочу связать черту с классом, который будет возвращать некоторую определяемую пользователем строку, а именно некоторый определяемый пользователем идентификатор регистрации. Поскольку эти регистрации должны быть определены во время компиляции, я хотел бы, чтобы это было 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 Время жизни строкового литерала, возвращаемого функцией).

Следовательно, безопасно и уместно ли такое использование string_view?


person Triskeldeian    schedule 04.06.2020    source источник
comment
stackoverflow.com/questions/45666043 /   -  person NoSenseEtAl    schedule 04.06.2020
comment
@NoSenseEtAl static constexpr переменные в области класса неявно inline, поэтому здесь не должно применяться.   -  person HolyBlackCat    schedule 04.06.2020
comment
@HolyBlackCat Я знаю, но понимаю, как ссылка может сбивать с толку того, кто этого не знает ...   -  person NoSenseEtAl    schedule 04.06.2020
comment
Спасибо @NoSenseEtAl, к счастью, эта часть уже была довольно ясна   -  person Triskeldeian    schedule 04.06.2020


Ответы (1)


Строковые литералы гарантированно имеют время жизни столько же, сколько и сама программа

Это правильно.

Следовательно, является ли такое использование string_view безопасным и уместным?

Да, ваш код в порядке.

person HolyBlackCat    schedule 04.06.2020